web-dev-qa-db-ja.com

Ansibleタスクのエラーを無視し、いずれかのタスクにエラーがある場合、プレイブックの最後で失敗する

私はAnsibleを学んでいます。リソースをクリーンアップするためのプレイブックがあり、プレイブックですべてのエラーを無視し、最後まで続行し、エラーがあった場合は最後に失敗するようにします。

エラーを無視できます

  ignore_errors: yes

それが1つのタスクであれば、私は次のようなことをすることができました(アンシブルエラーキャッチから)

- 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"

最後に失敗するにはどうすればよいですか?いくつかのタスクがありますが、「いつ」条件はどうなりますか?

36
Illusionist

Fail モジュールを使用します。

  1. エラーが発生した場合に無視する必要があるすべてのタスクでignore_errorsを使用します。
  2. タスクの実行に失敗した場合は常に、フラグを設定します(結果= falseなど)
  3. プレイブックの最後で、フラグが設定されているかどうかを確認し、それに応じて、実行に失敗します
- fail: msg="The execution has failed because of errors."
  when: flag == "failed"

更新:

Registerを使用して、例で示したようなタスクの結果を保存します。次に、次のようなタスクを使用します。

- name: Set flag
  set_fact: flag = failed
  when: "'FAILED' in command_result.stderr"
25
clever_bassi

ブロックで失敗する可能性のあるすべてのタスクをラップし、そのブロックでignore_errors: yesを使用できます。

tasks:
  - name: ls
    command: ls -la
  - name: pwd
    command: pwd

  - block:
    - name: ls non-existing txt file
      command: ls -la no_file.txt
    - name: ls non-existing pic
      command: ls -la no_pic.jpg
    ignore_errors: yes 

ブロックでのエラー処理の詳細をお読みください こちら

14
Olga

失敗モジュールはうまく機能します!ありがとう。

確認する前に事実を定義する必要がありました。定義しないと、未定義変数エラーが発生します。

そして、引用符とスペースなしでファクトを設定するときに問題がありました。

これはうまくいきました:

set_fact: flag="failed"

これはエラーを投げました:

set_fact: flag = failed 
1
dank