【问题标题】:Passing a Fabric env.hosts sting as a variable is not work in function将 Fabric env.hosts 刺痛作为变量传递在函数中不起作用
【发布时间】: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”是个麻烦。有人可以给我一个解决方案吗? 非常感谢。

【问题讨论】:

    标签: python fabric hosts env


    【解决方案1】:

    这是我的见解。

    根据docs,如果您从 python 脚本调用结构任务 - 您应该使用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。希望对您有所帮助。

    【讨论】:

    • 非常感谢亚历山大!我自己修好了,然后发现我们的方法是一样的。
    【解决方案2】:

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

    main.py

    #!/usr/bin/env python
    
    from demo import FabricSupport
    
    hosts = ['localhost']
    
    myfab = FabricSupport()
    myfab.execute("df",hosts)
    

    demo.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)
    

    python main.py

    [localhost] Executing task 'hostname'
    [localhost] run: hostname
    [localhost] out: heydevops-workspace
    

    【讨论】:

      猜你喜欢
      • 2014-06-16
      • 2011-12-07
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多