私は、複数のリモートノードで同時に簡単なジョブを実行するためにAnsibleを使用したいと考えています。実際の仕事では、いくつかのログファイルをグレープし、その結果をローカルホスト(リモートノードでは利用できないソフトウェアがある)に後処理します。私はどのようにプログラム可能かつ同時に実行できるのですか?
コマンドラインの使用可能なツールは、リモートで実行されたコマンドの出力で発生可能なフォーマットを混在させるため、このユースケースには適していないようです。 Python APIは、出力が変更されていないことを明らかにしているので、これが可能であるように思われます(ここでは関連してはならないユニコードの潜在的なマングリングとは別に)。
Pythonプログラムの簡易版は、私はこのようなルックスを作ってみた:ここ
from sys import argv
import ansible.runner
runner = ansible.runner.Runner(
pattern='*', forks=10,
module_name="command",
module_args=(
"""
sleep 10
"""),
inventory=ansible.inventory.Inventory(argv[1]),
)
results = runner.run()
、sleep 10
実際のログのgrepをコマンドの中に立っている - アイデアはありませんコマンドをシミュレートするだけですすぐに完了するだろう。
しかし、これを実行すると、私は取られた時間が私の目録内のホストの数に比例しているように見えます。ここでは2、5、及び9ホストと目録に対するタイミング結果は、それぞれ次のとおり
[email protected]:/tmp$ time python howlong.py two-hosts.inventory
real 0m24.285s
user 0m0.216s
sys 0m0.120s
[email protected]:/tmp$ time python howlong.py five-hosts.inventory
real 0m55.120s
user 0m0.224s
sys 0m0.160s
[email protected]:/tmp$ time python howlong.py nine-hosts.inventory
real 1m57.272s
user 0m0.360s
sys 0m0.284s
[email protected]:/tmp$
いくつかの他のランダム観察:
ansible all --forks=10 -i five-hosts.inventory -m command -a "sleep 10"
展示ansible all -c local --forks=10 -i five-hosts.inventory -m command -a "sleep 10"
が同時に物事を実行するために表示されるのと同じ挙動(もちろん、ローカルのみの接続でのみ動作します)- は同時に実行するように見えます
これはおそらく問題がsshトランスポートにあることを示唆しており、コマンドラインからではなくPython API経由での使用を何もしていないことを示しています。
インベントリ内のホストの数に関係なく、デフォルトのトランスポートが約10秒しかかからないようにするには、何が間違っていますか?
これは、ここで問題の原因を発見した後の私のバグレポートです。 :) –
ああ、私はこれがあなたから報告されたことを知らなかった(GH問題はmpdehaanによって開かれ、jimi-cによって修正された)。開発者の注目を集めてくれてありがとう! :) –