2012-01-19 5 views
9

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にネストされた実行中であることを伝え、設定スタックや同等のメソッドを使用して状態を覚えさせるより良い方法はありますか?

ありがとうございます!

+0

btw、私はファブリックを使用しています1.3.4 – adowds

+0

関数を直接呼び出すのではなく、なぜタスク内で 'execute()'を使うのですか? – jfs

+1

@JFSebastian私は、[documentation](http://docs.fabfile.org/ja/1.3.3/usage/execution.html#execute)があなたの質問に答えてくれたと思います: 'Fabricのデザインは魔法のような行為を避けます。タスク関数は、役割のようなデコレータを考慮しない。 – jcollado

答えて

1

あなたはファブリックを使用していません。ファイルのようにfabfileを実行する代わりに、fab deploy_codeと呼ぶだけです。私はあなたのファブファイルをどのように構築するかについて、より良い考え方のチュートリアルに進んでください。

しかし、​​とhereの詳細については、いずれにしてもlook hereとすることができます。

ウェブサーバーの役割から 's'を削除したという誤植があります。あなたが2番目のタスクでそれをしたいときに良いホスト文字列を持っていないことを説明するかもしれません。

しかし、それ以外に、execute()コマンド自体でロールとホストを設定することもできます。

関連する問題