gpt4 book ai didi

python - Airflow SSHExecuteOperator() with env=... 未设置远程环境

转载 作者:行者123 更新时间:2023-11-30 22:36:27 25 4
gpt4 key购买 nike

我正在修改调用进程的环境并附加到它的 PATH 以及设置一些新的环境变量。但是,当我在子进程中打印 os.environ 时,这些更改没有反射(reflect)出来。知道会发生什么吗?

我对实例上的脚本的调用:

ssh_hook = SSHHook(conn_id=ssh_conn_id)
temp_env = os.environ.copy()
temp_env["PATH"] = "/somepath:"+temp_env["PATH"]
run = SSHExecuteOperator(
bash_command="python main.py",
env=temp_env,
ssh_hook=ssh_hook,
task_id="run",
dag=dag)

最佳答案

说明:实现分析

如果您查看 Airflow 的来源 SSHHook class ,您会发现它根本没有将 env 参数合并到远程运行的命令中。SSHExecuteOperator implementationenv= 传递给 Hook 上的 Popen() 调用,但这仅将其传递给本地 subprocess.Popen() 实现,远程操作。

因此,简而言之:Airflow 不支持通过 SSH 传递环境变量。如果要具有此类支持,则需要将它们合并到远程执行的命令中,或者将 SendEnv 选项添加到本地执行的 ssh 命令中,以发送每个命令(其中即使这样,也只有在远程 sshd 配置了 AcceptEnv 将要接收的特定环境变量名称列入白名单时才有效。

<小时/>

解决方法:在命令行上传递环境变量

from pipes import quote # in Python 3, make this "from shlex import quote"

def with_prefix_from_env(env_dict, command=None):
result = 'set -a; '
for (k,v) in env_dict.items():
result += '%s=%s; ' % (quote(k), quote(v))
if command:
result += command
return result

SSHExecuteOperator(bash_command=prefix_from_env(temp_env, "python main.py"),
ssh_hook=ssh_hook, task_id="run", dag=dag)
<小时/>

解决方法:远程采购

如果您的环境变量很敏感,并且您不希望使用命令记录它们,则可以将它们传输到带外并获取包含它们的远程文件。

from pipes import quote

def with_env_from_remote_file(filename, command):
return "set -a; . %s; %s" % (quote(filename), command)

SSHExecuteOperator(bash_command=with_env_from_remote_file(envfile, "python main.py"),
ssh_hook=ssh_hook, task_id="run", dag=dag)

请注意,set -a 指示 shell 导出所有定义的变量,因此正在执行的文件只需使用 key=val 声明来定义变量;它们将被自动导出。如果从 Python 脚本生成此文件,请务必使用 pipes.quote() 引用键和值,以确保它仅执行分配而不运行其他命令。 . 关键字是符合 POSIX 标准的,相当于 bash source 命令。

关于python - Airflow SSHExecuteOperator() with env=... 未设置远程环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44165846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com