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

2024-04-28

将 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)

蟒蛇主.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)

蟒蛇主.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”是麻烦所在。有人可以给我一个解决方案吗? 多谢。


这是我的见解。

根据docs http://docs.fabfile.org/en/latest/usage/library.html,如果您从 python 脚本调用结构任务 - 您应该使用结构.任务.执行 http://docs.fabfile.org/en/latest/api/core/tasks.html#fabric.tasks.execute.

应该是这样的:

  • demo.py

    from fabric.api import run
    from fabric.tasks import execute
    
    
    def deploy(hosts, command):
        execute(execute_deploy, command=command, hosts=hosts)
    
    
    def execute_deploy(command):
        run(command)
    
  • main.py

    from demo import deploy
    
    hosts = ['localhost']
    command = 'hostname'
    
    deploy(hosts, command)
    

然后,只需运行python main.py。希望有帮助。

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

将 Fabric env.hosts 字符串作为变量传递在函数中不起作用 的相关文章

随机推荐