2013-04-25 50 views
5

傳遞結構env.hosts sting作爲變量在函數中不起作用。傳遞結構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) 

main.py

#!/usr/bin/env python 

from demo import deploy 

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

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

蟒蛇main.py

localhost 
[localhost] run: hostname 
[localhost] out: heydevops-workspace 

但env.host_string是不夠的我們來說,這是一臺主機。 也許我們可以在一個循環內使用env.host_string,但這並不好。 因爲我們也想設置併發任務編號並且並行運行它們。

現在ddep(我的配置引擎),我只用MySQLdb的獲得則參數,如執行晶圓廠命令:

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」是麻煩。有人可以給我一個解決方案嗎? 非常感謝。

回答

6

這是我的見解。

根據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。希望有所幫助。

+0

非常感謝亞歷山大!我自己修復它,然後發現我們的方式是一樣的。 – mcsrainbow 2013-04-25 10:00:24

+0

太棒了,這對我也很有用。謝謝! – xamox 2015-10-06 15:52:21

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) 

蟒蛇main.py

[localhost] Executing task 'hostname' 
[localhost] run: hostname 
[localhost] out: heydevops-workspace 
相關問題