2013-04-25 37 views
5

Truyền một vải env.hosts sting dưới dạng biến không hoạt động trong chức năng.Truyền một vải env.hosts sting dưới dạng biến không hoạt động trong chức năng

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: 

Nhưng env.host_string công trình!

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 

Nhưng env.host_string là không đủ cho chúng ta, đó là một máy chủ duy nhất . Có lẽ chúng ta có thể sử dụng env.host_string trong vòng lặp, nhưng điều đó không tốt. Bởi vì chúng tôi cũng muốn thiết lập số nhiệm vụ đồng thời và chạy chúng song song.

Bây giờ trong ddep (engine triển khai của tôi), tôi chỉ sử dụng MySQLdb để có được các thông số sau đó thực hiện lệnh fab như:

os.system("fab -f service/%s.py -H %s -P -z %s %s" % (project,host,number,task)) 

Đây là một cách đơn giản nhưng không tốt. Vì nếu tôi sử dụng lệnh fab, tôi không thể nắm bắt các ngoại lệ và lỗi của kết quả bằng Python, để làm cho ddep của tôi có thể "thử lại" các máy chủ không thành công. Nếu tôi sử dụng "từ triển khai nhập demo", tôi có thể kiểm soát và nhận chúng bằng một số mã bằng Python.

Vì vậy, bây giờ "env.host" là sự cố. Ai đó có thể cho tôi một giải pháp? Cảm ơn rất nhiều.

Trả lời

6

Đây là thông tin chi tiết của tôi.

Theo docs, nếu bạn đang gọi nhiệm vụ vải từ tập lệnh python - bạn nên sử dụng fabric.tasks.execute.

Nên smth như thế này:

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

Sau đó, chỉ cần chạy python main.py. Hy vọng rằng sẽ giúp.

+0

Thank you very much Alexander! Tôi cố định nó một mình, sau đó tìm thấy cách của chúng tôi là như nhau. – mcsrainbow

+0

Tuyệt vời, điều này cũng phù hợp với tôi. Cảm ơn! – xamox

2

Cuối cùng, tôi đã khắc phục sự cố này bằng cách sử dụng execute() và exec.

chính.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 
Các vấn đề liên quan