将Fabric env.hosts sting作为变量传递在函数中不起作用

mcs*_*bow 5 python env hosts fabric

将Fabric env.hosts sting作为变量传递在函数中不起作用.

demo.py

#!/usr/bin/env python

from fabric.api import env, run

def deploy(hosts, command):
    print hosts
    env.hosts = hosts
    run(command)
Run Code Online (Sandbox Code Playgroud)

main.py

#!/usr/bin/env python

from demo import deploy

hosts = ['localhost']
command = 'hostname'
deploy(hosts, command)
Run Code Online (Sandbox Code Playgroud)

python main.py

['localhost']
No hosts found. Please specify (single) host string for connection:
Run Code Online (Sandbox Code Playgroud)

但是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)
Run Code Online (Sandbox Code Playgroud)

main.py

#!/usr/bin/env python

from demo import deploy

host = 'localhost'
command = 'hostname'
deploy(host, command)
Run Code Online (Sandbox Code Playgroud)

python main.py

localhost
[localhost] run: hostname
[localhost] out: heydevops-workspace
Run Code Online (Sandbox Code Playgroud)

但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))
Run Code Online (Sandbox Code Playgroud)

这是一种简单的方法,但并不好.因为如果我使用fab命令,我无法捕获Python中结果的异常和失败,以使我的ddep可以"重试"失败的主机.如果我使用"来自demo demo deploy",我可以通过Python中的一些代码来控制和获取它们.

所以现在"env.host"就是麻烦.有人可以给我一个解决方案吗?非常感谢.

ale*_*cxe 6

这是我的见解.

根据文档,如果你从python脚本调用结构任务 - 你应该使用fabric.tasks.execute.

应该是这样的:

然后,跑吧python main.py.希望有所帮助.