fabfile没有看到远程环境变量

时间:2016-10-11 14:10:40

标签: python fabric

我的远程服务器(192.168.3.68)包含在〜/ .bashrc中设置的几个环境变量:

# For instance
export MY_DATABASE_HOST=127.0.0.1

当我将run('echo $MY_DATABASE_HOST')放入fabfile.py时,会显示:

[192.168.3.68] run: echo $MY_DATABASE_HOST
[192.168.3.68] output:

Done
Disconnecting from 192.168.3.68... done.

我尝试在回显之前立即添加run('source ~/.bashrc'),但没有任何变化。

为什么〜/ .bashrc中的设置环境变量对fabfile不可见?

我该怎么做才能解决这个问题,因为fabfile必须能够读取这些变量?

更新

from fabric.context_managers import prefix

# This didn't work
with prefix('source /home/meandme/.bashrc'):
    run('echo $MY_DATABASE_HOST')
# This didn't work either
run('source /home/meandme/.bashrc && echo $MY_DATABASE_HOST')

2 个答案:

答案 0 :(得分:1)

实际上执行了bashrc。但它被停止了,因为它没有以交互方式运行:

case $- in
     *i*) ;;
     *) return;;
esac

现在,我将环境变量移到了bashrc的顶部。

更详细的答案https://github.com/fabric/fabric/issues/1519

答案 1 :(得分:0)

run的每次调用都将打开一个新的shell,因此run的先前调用中的任何瞬态命令都会丢失(例如,设置环境变量)。要避免这个问题,你可以做两件事:

这样编写shell命令:

run('source /path/to/.bashrc && echo $MY_DATABASE_HOST')

或使用prefix上下文管理器

from fabric.context_managers import prefix
with prefix('source /path/to/.bashrc'):
    run('echo $MY_DATABASE_HOST')