2013-07-30 9 views
9

私は、複数のリモートノードで同時に簡単なジョブを実行するために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秒しかかからないようにするには、何が間違っていますか?

答えて

5

いくつかの調査では、〜/ .ssh/known_hostsのインベントリ内のホストを探していることが明らかになりました。私の設定でHashKnownHostsが有効になっています。それはハッシュで知られているホストのエントリ形式を理解していないため、探しているホストエントリを見つけることができませんでした。

潜在的なsshトランスポートが既知のホストエントリを見つけることができない場合、モジュールの実行中にグローバルロックが取得されます。このコンフルエンスの結果、すべての実行が効果的にシリアライズされます。

一時的な回避策は、host_key_checking = False~/.ansible.cfgに入れることによって、セキュリティと使用不可能なホストキーチェックを断念することです。もう1つの回避策は、paramikoトランスポートを使用することです(しかし、これは何らかの理由で、信じられないほど遅く、おそらく数十倍または数百倍も遅いです)。もう1つの回避策は、既知のエントリをknown_hostsファイルに追加して、潜在的なsshトランスポートが見つかるようにすることです。

3

HashKnownHostsが有効になっているので、最新バージョンのAnabilitiesにアップグレードする必要があります。バージョン1.3では、ハッシュされたknown_hostsのサポートが追加されました。the bug trackerchangelogを参照してください。これにより、セキュリティを犠牲にすることなく(host_key_checking=Falseを使用する回避策)、スピードを犠牲にすることなく(paramikoを使用した回避策)問題を解決するはずです。

Ansible 2.0のPython APIで
+1

これは、ここで問題の原因を発見した後の私のバグレポートです。 :) –

+0

ああ、私はこれがあなたから報告されたことを知らなかった(GH問題はmpdehaanによって開かれ、jimi-cによって修正された)。開発者の注目を集めてくれてありがとう! :) –

0

は、私が管理対象コンピュータ上で以下のように設定することで、かなりAnsibleをスピードアップするために管理

import ansible.constants 

ansible.constants.HOST_KEY_CHECKING = False 

でStrictHostKeyCheckingをオフに。最近のsshdではデフォルトの設定がありますので、必要ないかもしれません。

/etc/ssh/sshd_config 
---- 
UseDNS no 
関連する問題