2

max_fail_percentageホストの少なくともそのパーセンテージが成功した場合、プレイブックを進行させるようにansible プレイブックを設定できることを知っています。ただし、ホストの少なくとも一部がエラーなしで実行された場合に成功する (終了ステータス 0) アドホック コマンドを実行したいと考えていました。出来ますか?

4

1 に答える 1

1

たとえば 10 台のホストに影響する Playbook があり、実行中のある時点で 1 台のホストで失敗した場合、Ansible は (まったく設定max_fail_percentageしない場合) 他のすべてのホストで単純に続行します。これはデフォルトの動作です。通常、Playbook は、障害のあるホストでそれ以上のステップの実行を停止します。

これは、Ansible ドキュメントにも記載されています: Ansible - max_failure_percentage

この動作は、アドホック コマンドの場合とまったく同じです。テスト、テスト、テスト...

編集:

Ansible だけではこれは実行されませんが、Ansible の出力をたとえば perl ワンライナーにパイプすることで終了ステータスをオーバーライドし、別のコードで終了することができます。かなり醜いですが動作します :)

以下の例を参照してください。65% を超えるホストが成功した場合にのみ 0 で終了します。それ以外の場合、終了コードは 2 です。失敗をキャッチして解析するには、STDERR を ansible コマンドから STDOUT にリダイレクトする必要があります (したがって、最後に 2>&1 )。それ以外の場合、Perl はそれを認識しません)

$ ansible all -i provisioning/vagrant-inventory -u vagrant --private-key=~/.vagrant.d/insecure_private_key -m ping 2>&1 | perl -pe 'BEGIN { $failed=0; $success=0;} END { $exit_code=( $success/($success+$failed) ) > 0.65 ? 0 : 2; exit $exit_code;} $failed++ if /\| FAILED/i; $success++ if /\| success/i;'
192.168.111.210 | success >> {
    "changed": false, 
    "ping": "pong"
}

192.168.111.200 | success >> {
    "changed": false, 
    "ping": "pong"
}

192.168.111.211 | FAILED => SSH Error: data could not be sent to the remote host. Make sure this host can be reached over ssh

$ echo $?
0
于 2015-01-24T13:33:49.973 に答える