Ansible result.failed v.s. failed_when, result.changed v.s. changed_when etc

2

Ansible in 1.4 and later provides a way to specify this behavior as follows:

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

mas os Valores de retorno comuns já incluem .failed e .changed .

Parece-me que essas características se contradizem. Existe uma resolução oficial para isso? O Ansible define um dos failed_when ou changed_when como sendo avaliado primeiro e afetando o último? Define que ambos são avaliados sem ver o efeito do outro?

Por exemplo qual é o comportamento definido de

  1. command_result.failed dentro de uma expressão failed_when
  2. command_result.changed dentro de uma expressão changed_when
  3. command_result.failed dentro de uma expressão changed_when
  4. command_result.changed dentro de uma expressão changed_when

Para ser mais claro, por exemplo para o terceiro estou interessado em quão bem definido (confiável) o resultado do seguinte seria:

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

Digamos que eu esteja interessado no Ansible 2.0 e acima.

    
por sourcejedi 27.02.2018 / 17:16

1 resposta

2

Isso parece errado

Seu exemplo adiciona outro caminho ao seu playbook. Se o systemd não estiver instalado, a saída será diferente de se estiver instalada. E após a primeira execução, ele será instalado. Isso vai contra o princípio ansioso que diz:

Idempotency

An operation is idempotent if the result of performing it once is exactly the same as the result of performing it repeatedly without any intervening actions.

Se você ainda fizer isso, torne-o o mais explícito possível

Eu sugiro que você execute um comando which systemctl e registre a saída. Verifique a saída para instalar o systemd e falhe com uma tarefa de falha.

Esta ainda é uma questão muito interessante

Eu acho que não há documentação real e temos que investigar.

Espero ter encontrado todos os casos :) mas não posso preencher o gráfico agora.

playbook.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 }

tasks.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
    
por 27.02.2018 / 17:51

Tags