2012-01-19 40 views
9

Vải của Python cung cấp khả năng gọi hàm vải bên ngoài tiện ích fab bằng cách sử dụng chức năng execute. Một vấn đề theo ngữ cảnh phát sinh khi một hàm execute được gọi trong một hàm khác được gọi là sử dụng thực thi. Vải mất bối cảnh của bên ngoài thực hiện khi thực hiện bên trong được gọi và không bao giờ phục hồi nó. Ví dụ:Thực hiện các cuộc gọi lồng nhau để "thực hiện" với thư viện Fabric của Python

env.roledefs = { 
    'webservers': ['web1','web2'], 
    'load_balancer': ['lb1'] 
} 

@roles('webserver') 
def deploy_code(): 
    #ship over tar.gz of code to unpack. 
    ... 
    execute(remove_webserver_from_load_balancer, sHost=env.host_string) 
    ... 
    #shutdown webserver, unpack files, and restart web server 
    ... 
    execute(add_webserver_to_load_balancer, sHost=env.host_string) 

@roles('load_balancer') 
def remove_webserver_from_load_balancer(sHost=None): 
    ssh("remove_host %s" % sHost) 

execute(deploy_code) 

Sau khi cuộc gọi đầu tiên để execute, Vải hoàn toàn mất ngữ cảnh của nó và thực hiện tất cả các lệnh thêm trong deploy_code chức năng với host_string='lb1' thay vì 'web1'. Tôi làm cách nào để ghi nhớ?

tôi đến với hack này, nhưng tôi cảm thấy như nó có thể phá vỡ trên phiên bản tương lai:

with settings(**env): 
    execute(remove_webserver_from_load_balancer, sHost=env.host_string) 

này có hiệu quả tiết kiệm tất cả các nhà nước và khôi phục nó sau khi cuộc gọi, nhưng có vẻ như việc sử dụng ngoài ý muốn của chức năng. Có cách nào tốt hơn để nói với vải rằng nó trong một thực thi lồng nhau và sử dụng một ngăn xếp cài đặt hoặc một phương pháp tương đương để ghi nhớ nhà nước?

Cảm ơn!

+0

btw, tôi đang sử dụng Vải 1.3.4 – adowds

+0

Tại sao bạn sử dụng tác vụ bên trong 'execute()' thay vì chỉ gọi các hàm trực tiếp? – jfs

+1

@ JFSebastian Tôi nghĩ rằng [tài liệu] (http://docs.fabfile.org/en/1.3.3/usage/execution.html#execute) trả lời câu hỏi của bạn: 'Thiết kế của vải tránh được hành vi ma thuật, vì vậy chỉ cần gọi một chức năng nhiệm vụ không đưa vào tài khoản trang trí như vai trò'. – jcollado

Trả lời

1

Quyền sử dụng vải không phải của bạn. Khi bạn chỉ cần gọi fab deploy_code thay vì chạy fabfile như python của nó. Tôi khuyên bạn nên xem qua hướng dẫn để có ý tưởng tốt hơn về cách cấu trúc fabfile của bạn.

Nhưng dù sao, mặc dù bạn có thể look here về cách sử dụng execute(), và here để biết thêm các chi tiết cụ thể.

Bạn có lỗi đánh máy mà bạn đã bỏ 's' từ vai trò máy chủ web. Mà có thể tài khoản cho bạn không có một chuỗi máy chủ tốt khi bạn muốn nó vào nhiệm vụ thứ hai.

Nhưng ngoài ra, bạn cũng có thể đặt vai trò và máy chủ trong lệnh execute().

Các vấn đề liên quan