4

私は次のfabfile.pyを持っています:

from fabric.api import env, run

host1 = '192.168.200.181'
host2 = '192.168.200.182'
host3 = '192.168.200.183'

env.hosts = [host1, host2, host3]

def df_h():
    run("df -h | grep sda3")

そして、次の出力が得られます。

[192.168.200.181] run: df -h | grep sda3
[192.168.200.181] out: /dev/sda3             365G  180G  185G  50% /usr/local/nwe
[192.168.200.183] run: df -h | grep sda3
[192.168.200.183] out: /dev/sda3             365G   41G  324G  12% /usr/local/nwe
[192.168.200.182] run: df -h | grep sda3
[192.168.200.182] out: /dev/sda3             365G   87G  279G  24% /usr/local/nwe

Done.
Disconnecting from 192.168.200.182... done.
Disconnecting from 192.168.200.181... done.
Disconnecting from 192.168.200.183... done.

実行順序はenv.hostsの指定とは異なることに注意してください。

なぜこのように機能するのですか?実行順序をenv.hostsリストで指定されているものと同じにする方法はありますか?

4

2 に答える 2

5

順序が保持されない正確な理由は、env.hosts操作するホストを指定できる3つの「レベル」(env.hosts、コマンドライン、および関数ごと)があり、これらが一緒にマージされるためです。309行fabric/main.py目では、タイプを使用して、ホストの3つの可能なリストの重複を削除していることがわかります。順序がないため、ホストは「ランダム」な順序でリストとして返されます。set()set()

これが方法であるというかなりの理由があります。これは、リストから重複を削除するための非常に効率的なメカニズムであり、ファブリックの場合、順序が重要ではないことが重要です。さまざまなホストで一連の完全に並列なアトミックアクションを実行するようにファブリックに要求しています。並列のアトミックアクションの性質上、順序はアクションが正常に実行される能力に影響を与えません。順序が重要な場合、別の戦略が必要になり、ファブリックはもはやその仕事に適したツールではなくなります。

そうは言っても、これらの操作を順番に実行する必要がある特別な理由はありますか?おそらく、実行順序の結果として何らかの問題が発生している場合は、それを解決するのに役立ちます。

于 2009-12-24T05:10:10.903 に答える
1

更新するために、最新の Fabric 1.1+ (1.0 も考えてください) は、順序を維持する方法で重複排除します。したがって、これは今では問題にならないはずです。

于 2011-07-07T02:02:47.387 に答える