gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:44:14 24 4
gpt4 key购买 nike

当我运行这个 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,您看到此行为的原因是主机列表是在调用任务函数之前构建的。因此,即使您在函数内部更改 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.

如您所见,当 fabric 开始执行 mycmd 时,主机列表已设置为 ['other_host', ]

关于python - 如何在 Python Fabric `env.hosts` 的函数中正确设置 `fabfile.py`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9075364/

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