web-dev-qa-db-fra.com

Enregistrer la variable ansible dans plusieurs tâches

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

5
Gerald Schneider

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.

3
Henrik Pingel