5

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

演示.py

#!/usr/bin/env python

from fabric.api import env, run

def deploy(hosts, command):
    print hosts
    env.hosts = hosts
    run(command)

主文件

#!/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 有效!

演示.py

#!/usr/bin/env python

from fabric.api import env, run

def deploy(host, command):
  print host
  env.host_string = host
  run(command)

主文件

#!/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 可以“重试”失败的主机。如果我使用“从演示导入部署”,我可以通过 Python 中的一些代码来控制和获取它们。

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

4

2 回答 2

6

这是我的见解。

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

应该是这样的:

  • 演示.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)
    
  • 主文件

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

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

于 2013-04-25T09:27:12.573 回答
2

最后,我通过使用 execute() 和 exec 解决了这个问题。

主文件

#!/usr/bin/env python

from demo import FabricSupport

hosts = ['localhost']

myfab = FabricSupport()
myfab.execute("df",hosts)

演示.py

#!/usr/bin/env python

from fabric.api import env, run, execute

class FabricSupport:
    def __init__(self):
        pass

    def hostname(self):
        run("hostname")

    def df(self):
        run("df -h")

    def execute(self,task,hosts):
        get_task = "task = self.%s" % task
        exec get_task
        execute(task,hosts=hosts)

蟒蛇主.py

[localhost] Executing task 'hostname'
[localhost] run: hostname
[localhost] out: heydevops-workspace
于 2013-04-25T09:58:56.580 回答