可能なresult.failedとfailed_when、result.changed、selected_whenなど

可能なresult.failedとfailed_when、result.changed、selected_whenなど

Ansibleは、バージョン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"

しかし、一般的な戻り値すでに含まれて.failedいます.changed

私の考えでは、これらの特性は矛盾しています。正式な解決策はありますか? Ansibleはそのうちの1つを最初に評価し、後者に影響を与えるようにfailed_when定義しますか?changed_when他の効果を見ずに両方を評価することを定義しますか?

たとえば、定義された動作は何ですか?

  1. command_result.failedfailed_when表現内で
  2. command_result.changedchanged_when表現内で
  3. command_result.failedchanged_when表現内で
  4. command_result.changedchanged_when表現内で

たとえば、3番目の結果をより明確に説明すると、次の結果がどれだけうまく定義されているか(信頼できるように)に興味があります。

- package:
    name: systemd
    state: present
  check_mode: yes
  register: command_result
  failed_when: command_result.changed

私がAnsible 2.0以上に興味があるとしましょう。

答え1

これは正しいとは思わない。

あなたの例はプレイブックに別のルートを追加します。 systemdがインストールされていない場合は、インストールしたときと出力が異なります。最初の実行後にインストールされます。これはAnsible原則に違反します。

等級

演算を一度行った結果が中間演算なしで繰り返し演算を行った結果とまったく同じであれば、その演算は冪等性があります。

それでもこれを行う場合は、できるだけ明示的に説明してください。

コマンドを実行してwhich systemctl出力を登録することをお勧めします。 systemd インストールの出力を確認すると、失敗した操作によって失敗します。

これはまだ非常に興味深い質問です。

実際の文書がないようです。調べるべきだと思います。

すべての出来事をすべて捕まえたら良いです:) ところで、今はチャートを埋めることはできません。

script.yml:

---

- name: test some stuff
  hosts: all
  tasks:
    - include_tasks: tasks.yml
      with_items:
        - { data: ping, changed: true }
        - { data: ping, changed: false }
        - { data: crash, changed: true }
        - { data: crash, changed: false }

アクション.yml

---

- name: Check for command_result is defined and command_result
  ping:
    data: "{{ item.data }}"
  register: command_result
  changed_when: item.changed
  failed_when: command_result is defined and command_result
  ignore_errors: true

- name: Check for command_result is defined and command_result
  file:
    path: ./file
  register: command_result
  changed_when: item.changed
  failed_when: command_result is defined and command_result
  ignore_errors: true

- name: Check for command_result
  ping:
    data: "{{ item.data }}"
  register: command_result
  changed_when: item.changed
  failed_when: command_result
  ignore_errors: true

- name: Check for command_result
  file:
    path: ./file
  register: command_result
  changed_when: item.changed
  failed_when: command_result
  ignore_errors: true

- name: Check for command_result.changed is defined and command_result.changed
  ping:
    data: "{{ item.data }}"
  register: command_result
  changed_when: item.changed
  failed_when: command_result.changed is defined and command_result.changed

- name: Check for command_result.changed is defined and command_result.changed
  ping:
    data: "{{ item.data }}"
  register: command_result
  changed_when: item.changed
  failed_when: command_result.changed is defined and command_result.changed
  ignore_errors: true

- name: Check for command_result.changed
  ping:
    data: "{{ item.data }}"
  register: command_result
  changed_when: item.changed
  failed_when: command_result.changed
  ignore_errors: true

- name: Check for command_result.changed
  file:
    path: ./file
  register: command_result
  changed_when: item.changed
  failed_when: command_result.changed
  ignore_errors: true

関連情報