it-swarm.com.de

Registrieren Sie eine ansible Variable in mehreren Aufgaben

Ich verwende die folgenden Aufgaben in einem ansiblen Skript, das Updates auf verschiedenen Servern installiert. Diese Aufgaben gelten für CentOS-Computer:

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

Das Ergebnis:

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

Wie Sie sehen können, speichern beide Prüfaufgaben das Ergebnis in einer Variablen namens "Ergebnis", aber nur die Variablen für die Hosts in der zweiten Aufgabe (mit ansible_distribution_major_version|int >= 7) werden gefüllt, was zu den Fehlermeldungen führt. Es scheint, dass die zweite Überprüfungsaufgabe die Ergebnisse der vorherigen Aufgabe aufhebt.

Ist es möglich, die Ergebnisse beider Aufgaben zu behalten? Oder muss ich die Berichtsaufgabe kopieren und die Versionsprüfung zu beiden hinzufügen? Ich hätte den Bericht lieber an einem Ort.

Ansible Version ist 2.4.4.0

5

Dies liegt daran, dass Ansible das Ergebnis auch dann speichert, wenn die Aufgabe übersprungen wird:

Wenn eine Aufgabe fehlschlägt oder übersprungen wird, wird die Variable weiterhin mit einem Fehler oder einem übersprungenen Status registriert. Die einzige Möglichkeit, die Registrierung einer Variablen zu vermeiden, ist die Verwendung von Tags.

Ansible Benutzerhandbuch für registrierte Variablen

Nein, es ist nicht möglich, das Ergebnis beider Aufgaben zu behalten.

Ich würde, wie Sie bereits vorgeschlagen haben, die Berichtsaufgabe kopieren und die Versionsprüfung zu beiden hinzufügen.

3
Henrik Pingel