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!
btw, tôi đang sử dụng Vải 1.3.4 – adowds
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
@ 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