Pythonのファブリックは、execute
関数を使用してfab
ユーティリティの外部でファブリック関数を呼び出す機能を提供します。文脈上の問題は、execute
関数がexecuteを使用して呼び出された別の関数内で呼び出されたときに発生します。ファブリックは、内部実行が呼び出されたときに外部実行のコンテキストを失い、それを回復しません。例えば: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)
execute
の最初の呼び出しの後、布は完全にそのコンテキストを失い、host_string='lb1'
代わりに'web1'
とdeploy_code
関数内のすべてのさらなるコマンドを実行します。 どうすればそれを思い出すことができますか?
私はこのハックを思い付いたが、それは将来のリリースで破ることができような気がします:
with settings(**env):
execute(remove_webserver_from_load_balancer, sHost=env.host_string)
これが効果的にすべての状態を保存し、呼び出しの後にそれを復元しますが、意図しない使用のように思えます関数。 Fabricにネストされた実行中であることを伝え、設定スタックや同等のメソッドを使用して状態を覚えさせるより良い方法はありますか?
ありがとうございます!
btw、私はファブリックを使用しています1.3.4 – adowds
関数を直接呼び出すのではなく、なぜタスク内で 'execute()'を使うのですか? – jfs
@JFSebastian私は、[documentation](http://docs.fabfile.org/ja/1.3.3/usage/execution.html#execute)があなたの質問に答えてくれたと思います: 'Fabricのデザインは魔法のような行為を避けます。タスク関数は、役割のようなデコレータを考慮しない。 – jcollado