Ansible 2.4 - Error Handling In Playbooks
プレイブックでのエラー処理

Anabilitiesは、通常、コマンドやモジュールの戻りコードを確認し、速く失敗するデフォルトを持っています。そうしないと決して決定しない限り、エラーは処理されます。
時々、0以外の値を返すコマンドはエラーではありません。 コマンドによっては、リモートシステムが変更されたということを必ずしも報告する必要はない場合もあります。 このセクションでは、出力とエラー処理の動作が必要に応じて行われるように、特定のタスクに対してデフォルトの動作を変更する方法について説明します。
失敗したコマンドを無視する
バージョン0.6の新機能
一般に、プレイブックは、タスクが失敗したホスト上でこれ以上のステップの実行を停止します。 時には、あなたは続けたいと思っています。 これを行うには、次のようなタスクを記述します。
- name: this will not be counted as a failure command: /bin/false ignore_errors: yes
上記のシステムは、特定のタスクの失敗の戻り値のみを管理するため、未定義の変数が使用されているか構文エラーがある場合でも、ユーザーが対処する必要があるエラーが発生します。 これにより、接続や実行の問題での失敗を防ぐことはできません。 この機能は、タスクが実行され、「失敗」の値を返すことができる必要がある場合にのみ機能します。
到達不能なホストのリセット
バージョン2.2の新機能
接続障害は、ホストを「UNREACHABLE」として設定します。これにより、実行のためにアクティブなホストのリストからホストが削除されます。 これらの問題から回復するには、 meta: clear_host_errors
を使用して、現在フラグが立てられているすべてのホストを再度meta: clear_host_errors
することができます。
ハンドラとエラー
バージョン1.9.1の新機能
ホスト上でタスクが失敗すると、以前に通知されたハンドラーはそのホスト上で実行されません 。 これは、無関係な障害がホストを予期しない状態にする可能性がある場合につながります。 たとえば、タスクは構成ファイルを更新し、ハンドラにサービスを再起動するよう通知することができます。 後で同じプレイでタスクが失敗すると、設定が変更されてもサービスは再開されません。
この動作を変更するには、 --force-handlers
force_handlers: True
--force-handlers
コマンドラインオプションを使用するか、 force_handlers: True
を含めることができます。プレイではforce_handlers = True
、anacible.cfgではforce_handlers = True
です。 ハンドラが強制的に実行されると、そのホスト上でタスクが失敗した場合でも通知されたときに実行されます。 (特定のエラーによって、ホストが到達不能になるなど、ハンドラが実行されないことがあります)。
障害を定義するものの制御
バージョン1.4の新機能
コマンドのエラーコードが無意味であり、実際に問題があるかどうかを知るためには、たとえば "FAILED"という文字列が出力にある場合など、コマンドの出力が重要です。
1.4以降では、この動作を次のように指定する方法が提供されています。
- name: Fail task when the command error output prints FAILED command: /usr/bin/example-command -x -y -z register: command_result failed_when: "'FAILED' in command_result.stderr"
またはリターンコードに基づいて:
- name: Fail task when both files are identical raw: diff foo/file1 bar/file2 register: diff_cmd failed_when: diff_cmd.rc == 0 or diff_cmd.rc >= 2
Anversの以前のバージョンでは、これは次のように実行できます。
- name: this command prints FAILED when it fails command: /usr/bin/example-command -x -y -z register: command_result ignore_errors: True - name: fail the play if the previous command did not succeed fail: msg="the command failed" when: "'FAILED' in command_result.stderr"
変更された結果を上書きする
バージョン1.3の新機能
シェル/コマンドまたは他のモジュールが実行されると、通常、マシンの状態に影響を与えたと考えられるかどうかに基づいて、「変更された」状態が報告されます。
場合によっては、リターンコードまたは出力に基づいて変更が加えられておらず、レポート出力に表示されないか、またはハンドラーが起動しないように「変更された」結果をオーバーライドしたい場合があります。
tasks: - shell: /usr/bin/billybass --mode="take me to the river" register: bass_result changed_when: "bass_result.rc != 2" # this will never report 'changed' status - shell: wall 'beep' changed_when: False
遊びを中止する
場合によっては、ホストの残りのタスクをスキップするだけでなく、失敗時にプレイ全体を中止することが望ましい場合もあります。
any_errors_fatal
再生オプションは、障害が発生した場合、すべてのホストを失敗としてマークし、即時中止を引き起こします。
- hosts: somehosts any_errors_fatal: true roles: - myrole
きめ細かな制御のためにmax_fail_percentage
は、指定された割合のホストが失敗した後に実行を中止するために使用できます。
も参照してください
- Playbooks
- プレイブックの紹介
- ベストプラクティス
- プレイブックでのベストプラクティス
- Conditionals
- プレイブックの条件文
- Variables
- 変数に関するすべて
- ユーザーメーリングリスト
- 質問があります? Googleグループでやめてください!
- irc.freenode.net
- #ansible IRCチャットチャンネル