如何在 Python Fabric `fabfile.py` 的函数中正确设置 `env.hosts`?

2023-11-21

当我运行这个时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,您看到此行为的原因是因为主机列表是构建的before调用任务函数。所以,即使你在改变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', ]当fabric开始执行时mycmd.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Python Fabric `fabfile.py` 的函数中正确设置 `env.hosts`? 的相关文章

随机推荐