5 votos

Registro de ansible variable en múltiples tareas

Estoy usando las siguientes tareas en un ansible script que instala las actualizaciones en varios servidores. Estas tareas son para CentOS máquinas:

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

El 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 se puede ver tanto en las tareas de verificación almacenar el resultado en una variable llamada "resultado", sino sólo las variables para los anfitriones en la segunda tarea (con ansible_distribution_major_version|int >= 7) está lleno, lo que resulta en los mensajes de error. Parece que la segunda tareas de verificación desactiva los resultados de la tarea anterior.

Es posible mantener los resultados de ambas tareas? O tengo que copiar la tarea de informes y añadir la versión de verificación para ambos? Prefiero tener el informe en un solo lugar.

Ansible versión es 2.4.4.0

3voto

knowhy Puntos 189

Esto sucede porque el Ansible se va a almacenar el resultado, incluso cuando la tarea se omite:

Si una tarea no se realiza o se omite, la variable todavía está registrado con un fracaso o saltado de estado, la única manera de evitar el registro de una variable es el uso de etiquetas.

Ansible guía del usuario en el registro de-variables

Así que, no, no es posible mantener el resultado de ambas tareas.

Me gustaría, como ya se ha sugerido, copia del informe de la tarea y añadir la versión de verificación para ambos.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: