【发布时间】:2013-04-25 07:53:25
【问题描述】:
将 Fabric env.hosts 字符串作为变量传递在函数中不起作用。
demo.py
#!/usr/bin/env python
from fabric.api import env, run
def deploy(hosts, command):
print hosts
env.hosts = hosts
run(command)
main.py
#!/usr/bin/env python
from demo import deploy
hosts = ['localhost']
command = 'hostname'
deploy(hosts, command)
python main.py
['localhost']
No hosts found. Please specify (single) host string for connection:
但是 env.host_string 有效!
demo.py
#!/usr/bin/env python
from fabric.api import env, run
def deploy(host, command):
print host
env.host_string = host
run(command)
main.py
#!/usr/bin/env python
from demo import deploy
host = 'localhost'
command = 'hostname'
deploy(host, command)
python main.py
localhost
[localhost] run: hostname
[localhost] out: heydevops-workspace
但是 env.host_string 对我们来说是不够的,它是一个主机。 也许我们可以在循环中使用 env.host_string,但这并不好。 因为我们还想设置并发任务数,并行运行。
现在在 ddep(我的部署引擎)中,我只使用 MySQLdb 获取参数然后执行 fab 命令,如:
os.system("fab -f service/%s.py -H %s -P -z %s %s" % (project,host,number,task))
这是一个简单的方法,但不是很好。 因为如果我使用 fab 命令,我无法在 Python 中捕获结果的异常和失败,以使我的 ddep 可以“重试”失败的主机。 如果我使用“from demo import deploy”,我可以通过Python中的一些代码来控制和获取它们。
所以现在“env.host”是个麻烦。有人可以给我一个解决方案吗? 非常感谢。
【问题讨论】: