Ansible 2.4 - Error Handling In Playbooks

プレイブックでのエラー処理




ansible

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チャットチャンネル