Registre variável ansiável em múltiplas tarefas

2

Estou usando as seguintes tarefas em um script ansible que instala atualizações em vários servidores. Estas tarefas são para máquinas CentOS:

- name: Check for outstanding reboot
  shell: needs-restarting > /dev/null || echo Reboot required
  when: ansible_distribution_major_version|int < 7
  register: result
- name: Check for outstanding reboot
  shell: needs-restarting -r > /dev/null || echo Reboot required
  when: ansible_distribution_major_version|int >= 7
  register: result
- name: Report reboot
  debug: msg="{{ result.stdout_lines }}"

O resultado:

TASK [Check for outstanding reboot] ***********************************************************************************
skipping: [host1]
skipping: [host2]
skipping: [host5]
changed: [host3]
changed: [host4]

TASK [Check for outstanding reboot] ***********************************************************************************
skipping: [host3]
skipping: [host4]
changed: [host2]
changed: [host1]
changed: [host5]

TASK [Report reboot] **************************************************************************************************
fatal: [host3]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'stdout_lines'\n\nThe error appears to have been in '/path/to/updates.yml': line 52, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n    register: result\n  - name: Report reboot\n    ^ here\n\nexception type: <class 'ansible.errors.AnsibleUndefinedVariable'>\nexception: 'dict object' has no attribute 'stdout_lines'"}
ok: [host1] => {
    "msg": [
        "Reboot required"
    ]
}
fatal: [host4]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'stdout_lines'\n\nThe error appears to have been in '/path/to/updates.yml': line 52, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n    register: result\n  - name: Report reboot\n    ^ here\n\nexception type: <class 'ansible.errors.AnsibleUndefinedVariable'>\nexception: 'dict object' has no attribute 'stdout_lines'"}
ok: [host2] => {
    "msg": [
        "Reboot required"
    ]
}
ok: [host5] => {
    "msg": [
        "Reboot required"
    ]
}
        to retry, use: --limit @/path/to/updates.retry

Como você pode ver, as duas tarefas de verificação armazenam o resultado em uma variável chamada "resultado", mas apenas as variáveis dos hosts na segunda tarefa (com ansible_distribution_major_version|int >= 7 ) são preenchidas, resultando nas mensagens de erro. Parece que as tarefas da segunda verificação anulam os resultados da tarefa anterior.

É possível manter os resultados de ambas as tarefas? Ou eu tenho que copiar a tarefa de relatório e adicionar a verificação de versão para ambos? Eu prefiro ter o relatório em um só lugar.

Versão Ansible é 2.4.4.0

    
por Gerald Schneider 15.05.2018 / 08:41

1 resposta

2

Isso acontece porque o Ansible armazena o resultado mesmo quando a tarefa é ignorada:

If a task fails or is skipped, the variable still is registered with a failure or skipped status, the only way to avoid registering a variable is using tags.

Guia do usuário anível das variáveis registradas

Portanto, não, não é possível manter o resultado de ambas as tarefas.

Eu, como você já sugeriu, eu copiaria a tarefa de relatório e adicionaria a verificação de versão a ambos.

    
por 16.05.2018 / 15:00