Fabric2中的环境变量

时间:2018-10-05 16:41:12

标签: python fabric

我正在使用Python 3.6和Fabric 2.4。我正在使用Fabric将SSH连接到服务器并运行一些命令。我需要为在远程服务器上运行的命令设置环境变量。该文档表明应该执行以下操作:

from fabric import task

@task(hosts=["servername"])
def do_things(c):
    c.run("command_to_execute", env={"KEY": "VALUE"})

但这不起作用。这样的事情也应该是可能的:

from fabric import task

@task(hosts=["servername"])
def do_things(c):
    c.config.run.env = {"KEY": "VALUE"}
    c.run("command_to_execute")

但这也不起作用。我觉得我想念一些东西。有人可以帮忙吗?

5 个答案:

答案 0 :(得分:1)

通过设置inline_ssh_env=True,然后显式设置env变量,例如:

with Connection(host=hostname, user=username, inline_ssh_env=True) as c:
    c.config.run.env = {"MY_VAR": "this worked"}
    c.run('echo $MY_VAR')

答案 1 :(得分:0)

根据that part of the official docconnect_kwargs对象的Connection属性旨在替换env字典。我使用了它,并且按预期运行。

答案 2 :(得分:0)

如Fabric网站上所述:

  

其根本原因通常是因为SSH服务器通过非常有限的shell调用运行非交互式命令:/ path / to / shell -c“ command”(例如,OpenSSH)。以这种方式运行时,大多数外壳都不被认为是交互式外壳或登录外壳。然后会影响加载哪些启动文件。

您在此页面link

上了解更多

因此您尝试执行的操作无效,解决方案是传递要显式设置的环境变量:

from fabric import task

    @task(hosts=["servername"])
    def do_things(c):
        c.config.run.env = {"KEY": "VALUE"}
        c.run('echo export %s >> ~/.bashrc ' % 'ENV_VAR=VALUE' )
        c.run('source ~/.bashrc' )
        c.run('echo $ENV_VAR') # to verify if it's set or not! 
        c.run("command_to_execute")

答案 3 :(得分:0)

您可以尝试:

@task
def qa(ctx):
  ctx.config.run.env['counter'] = 22
  ctx.config.run.env['conn'] = Connection('qa_host')

@task
def sign(ctx):
  print(ctx.config.run.env['counter'])
  conn = ctx.config.run.env['conn']
  conn.run('touch mike_was_here.txt')

然后运行:

fab2 qa sign

答案 4 :(得分:0)

在创建Connection对象时,请尝试添加inline_ssh_env=True

引用documentation

  

是否将环境变量“内联”作为前缀发送到命令字符串(export VARNAME=value && mycommand here)的前面,而不是尝试通过SSH协议本身提交它们(这是默认行为)。如果远程服务器具有受限制的AcceptEnv设置(这是常见的默认设置),则很有必要。