如何在我的Python Fabric`fabfile.py`中的函数中正确设置`env.hosts`?
问题内容:
当我运行这个fabfile.py
…
from fabric.api import env, run, local, cd
def setenv(foo):
env.hosts = ['myhost']
def mycmd(foo):
setenv(foo)
print(env.hosts)
run('ls')
使用此命令fab mycmd:bar
。我得到这个输出…
['myhost']
No hosts found. Please specify (single) host string for connection:
什么什么?!我不明白吗?我已经设置了env.hosts
该mycmd
函数,并且在该函数“内部”似乎是有效的,但是由于某种原因该run
命令不知道hosts
我所指定的。
使我困惑。任何帮助,将不胜感激!
问题答案:
@Chris,您看到此行为的原因是因为主机列表是 在 调用task函数 之前
构造的。因此,即使您要env.hosts
在函数内部进行更改,也要使它生效没有为时已晚。
而命令fab setenv:foo mycmd:bar
会产生您所期望的结果:
$ fab setenv:foo mycmd:bar
[myhost] Executing task 'mycmd'
['myhost']
[myhost] run: ls
这与接受的答案相同,但是由于setenv
定义了方式,因此需要一个参数。
另一个例子:
from fabric.api import env, run, local, cd
env.hosts = ['other_host']
def setenv(foo):
env.hosts = ['myhost']
def mycmd(foo):
setenv(foo)
print('env.hosts inside mycmd: %s' % env.hosts)
run('ls')
输出为:
$ fab mycmd:bar
[other_host] Executing task 'mycmd'
env.hosts inside mycmd: ['myhost']
[other_host] run: ls
Fatal error: Name lookup failed for other_host
Underlying exception:
(8, 'nodename nor servname provided, or not known')
Aborting.
如您所见,['other_host', ]
架构开始执行时,主机列表已经设置为mycmd
。