J'utilise les tâches suivantes dans un script ansible qui installe des mises à jour sur divers serveurs. Ces tâches concernent les machines 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 }}"
Le résultat:
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
Comme vous pouvez le voir, les deux tâches de vérification stockent le résultat dans une variable appelée "résultat", mais uniquement les variables pour les hôtes de la deuxième tâche (avec ansible_distribution_major_version|int >= 7
) sont remplis, entraînant des messages d'erreur. Il semble que la deuxième tâche de vérification efface les résultats de la tâche précédente.
Est-il possible de conserver les résultats des deux tâches? Ou dois-je copier la tâche de rapport et ajouter la vérification de version aux deux? Je préfère avoir le rapport au même endroit.
La version Ansible est 2.4.4.0
Cela se produit car Ansible stockera le résultat même lorsque la tâche est ignorée:
Si une tâche échoue ou est ignorée, la variable est toujours enregistrée avec un état d'échec ou ignoré, la seule façon d'éviter d'enregistrer une variable est d'utiliser des balises.
Guide de l'utilisateur Ansible sur les variables enregistrées
Donc, non, il n'est pas possible de conserver le résultat des deux tâches.
Je voudrais, comme vous l'avez déjà suggéré, copier la tâche de rapport et ajouter la vérification de version aux deux.