Ansible: Schwerwiegender Fehler, der von include_tasks ausgelöst wird, selbst wenn ein Block-Rescue-Block verwendet wird

Ansible: Schwerwiegender Fehler, der von include_tasks ausgelöst wird, selbst wenn ein Block-Rescue-Block verwendet wird

Ich versuche, mehrere Aufgaben basierend auf einigen in einer Hostvar definierten Werten einzubinden, aber es werden einige schwerwiegende Fehler ausgegeben, selbst wenn ich den Block-Rescue-Block verwende. Ich habe die VariableProfiledefiniert inhost_vars/hostname.yml:

profiles: '["profile1","trap1"]'

und die RolleTestprofileIn/etc/ansible/roles. Hier habe ich im Aufgabenverzeichnis die folgenden .yml-Dateien:profil1.yml, profil2.yml, main.yml.

Der Inhalt der Datei main.yml ist:

- name: import profiles
   block:
     - include_tasks: "{{ item }}.yml"
       with_items: "{{ profiles|default([]) }}"
   rescue:
     - debug: msg='Error encountered while trying to include a .yml file corresponding to a defined profile from profiles variable. Profiles - "{{ profiles }}"'
   when: profiles is defined

Der Inhalt des Playbooks ist:

 - name: Test profiles config
   hosts: myhost
   roles:
     - test_profiles

Die Ausgabe sieht ungefähr so ​​aus:

TASK [test_profiles : include_tasks] ***********************************************************************************************************************************************************************
included: /etc/ansible/roles/test_profiles/tasks/profile.yml for <my_host>
fatal: [<my_host>]: FAILED! => {"reason": "Unable to retrieve file contents\nCould not find or access '/etc/ansible/trap1.yml'"}

TASK [test_profiles : Ensure that profile directory exists into the D:\profiles directory] ************************************************************************************************
ok: [<my_host>]

TASK [test_profiles : Update profile.properties file] ***************************************************************************************************************************************************
ok: [<my_host>]

TASK [test_profiles : debug] *******************************************************************************************************************************************************************************
ok: [<my_host>] => {
    "msg": "Error encountered while trying to include a .yml file corresponding to a defined profile from profiles variable. Profiles - \"[\"profile1\",\"trap1\"]\""
}
        to retry, use: --limit @/etc/ansible/playbook_test_profiles.retry

PLAY RECAP ********************************************************************************************************************************************************************************************************
<my_host>                 : ok=5    changed=0    unreachable=0    failed=1

Aus meiner Sicht sollte dieser schwerwiegende Fehler nicht auftreten. Was mache ich hier falsch und wie kann ich ihn beseitigen? Ich habe es auch mit einemWannbedingt, aber ohne Erfolg.

Ich benutzeAnsible 2.4.2.0und die Aufgaben werden für einige Windows-Hosts ausgeführt.

Antwort1

block/ rescueverhindert nicht, dass Fehler auftreten. Es erkennt fehlgeschlagene Aufgaben und führt rescueeinen Block aus, um den Fehler zu beheben. Die fehlgeschlagene Aufgabe ist jedoch immer noch vorhanden und wird in der Spielzusammenfassung angezeigt.

Ich würde empfehlen, beim Entwerfen von Playbooks den Fail-Fast-Ansatz zu verwenden. In Ihrem Fall können Sie Ihre lokalen Dateien scannen, um zu testen, ob die Benutzereingabe (bereitgestellte Konfiguration) gültig ist: ob Profildateien vorhanden sind. Benutzer assert/ failModule.

Antwort2

Am Ende habe ich den Block-Rescue-Block entfernt. Ich habe einen Weg gefunden, um zu überprüfen, ob meine .yml-Datei existiert. Dies geschieht mit demRollenpfadVariable (die den Pfad der aktuellen Rolle zurückgibt - verfügbar seit Ansible 1.8 - dies funktioniert nur innerhalb einer Rolle) und der Testist_Datei.

Meine main.yml für die oben beschriebene Rolle sieht folgendermaßen aus:

- name: Import profiles
   include_tasks: "{{ item }}.yml"
   with_items: "{{ profiles|default([]) }}"
   when: (role_path + '/tasks/' + item + '.yml') | is_file

Aufgrund dieser Prüfung wird keine schwerwiegende Ausnahme mehr ausgelöst – die Datei trap1.yml wird übersprungen.

Die Ausgabe sieht ungefähr so ​​aus:

TASK [test_profiles : Import profiles] ***********************************************************
skipping: [<my_host>] => (item=trap1)
included: /etc/ansible/roles/test_profiles/tasks/profile1.yml for <my_host>

TASK [test_profiles : Ensure that profile directory exists into the D:\profiles directory] *******
ok: [<my_host>]

TASK [test_profiles : Update profile.properties file] ********************************************
changed: [<my_host>]
        to retry, use: --limit @/etc/ansible/playbook_test_profiles.retry

PLAY RECAP ***************************************************************************************
<my_host>                 : ok=4    changed=1    unreachable=0    failed=0

Ich bin mit dieser Lösung einverstanden, bin aber auch für andere Vorschläge offen.

verwandte Informationen