Ansible: Die Verwendung von with_dict und wann überspringt die Aufgabe nicht, wenn sie nicht definiert ist

Erstellt am 11. Aug. 2014  ·  3Kommentare  ·  Quelle: ansible/ansible

Problemtyp:

Fehlerbericht

Ansible-Version:

ansible 1.7

Umfeld:

Ausführen des Betriebssystems von: OSX 10.9
Verwaltung: Ubuntu 14.04

Zusammenfassung:

Wenn eine Aufgabe mit "with_dict" und "when" verwendet wird und der Wert von when als false ausgewertet wird, versucht ansible, nach einem dict-Wert zu suchen und schlägt fehl, wenn die Aufgabe übersprungen werden sollte.

Schritte zum Reproduzieren:

Gastgeber:

[test]
testhost

playbook.yml:

- hosts: all
  tasks:
   - name: Delete a user
     user: name="{{item}}" state=absent
     when: users_deleted is defined
     with_dict: users_deleted

Befehl: ansible-playbook -i hosts playbook.yml
Ich habe user_deleted nicht definiert, daher sollte diese Aufgabe übersprungen werden.
Wenn Sie in playbook.yml "with_dict" in "with_items" ändern, wird die Aufgabe korrekt übersprungen.

Erwartete Ergebnisse:

Ergebnisse aus der Ausführung der Aufgabe mit "with_items" anstelle von "with_dict":

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [testhost]

TASK: [Delete a user] *********************************************************
skipping: [testhost] => (item=users_deleted)

PLAY RECAP ********************************************************************
testhost             : ok=2    changed=0    unreachable=0    failed=0
Tatsächliche Ergebnisse:
PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [testhost]

TASK: [Delete a user] *********************************************************
fatal: [testhost] => with_dict expects a dict

FATAL: all hosts have already failed -- aborting

PLAY RECAP ********************************************************************

testhost            : ok=1    changed=0    unreachable=1    failed=0

Hilfreichster Kommentar

Hi!

Dies ist ein kleines Missverständnis, aber die Bedingung hier wird für jedes einzelne Element ausgewertet, was eine erforderliche Funktion ist. Um es für jedes Element auszuwerten, muss es mit etwas beginnen, für das es iterieren kann.

Daher möchten Sie vielleicht Folgendes tun:

with_dict: "{{ users_deleted | default({}) }}"

Was helfen sollte, dies zu beheben.

Es würde Ihnen auch ermöglichen, die when-Klausel zu entfernen, da die Liste eine Länge von Null anstelle von undefiniert hätte.

Kommen Sie gerne bei ansible-project vorbei, wenn Sie weitere Fragen haben, wir helfen Ihnen gerne weiter.

Vielen Dank!

Alle 3 Kommentare

Hi!

Dies ist ein kleines Missverständnis, aber die Bedingung hier wird für jedes einzelne Element ausgewertet, was eine erforderliche Funktion ist. Um es für jedes Element auszuwerten, muss es mit etwas beginnen, für das es iterieren kann.

Daher möchten Sie vielleicht Folgendes tun:

with_dict: "{{ users_deleted | default({}) }}"

Was helfen sollte, dies zu beheben.

Es würde Ihnen auch ermöglichen, die when-Klausel zu entfernen, da die Liste eine Länge von Null anstelle von undefiniert hätte.

Kommen Sie gerne bei ansible-project vorbei, wenn Sie weitere Fragen haben, wir helfen Ihnen gerne weiter.

Vielen Dank!

Am Ende habe ich verwendet:
with_dict: users_deleted | Ursprünglich({})

Dies funktioniert wie erwartet und überspringt die Aufgabe. Als Benutzer war dies ein wenig verwirrend, da ich erwarten würde, "when:" konsistent verwenden zu können, wenn ich eine Bedingung für eine Aufgabe benötige. Danke für die Klärung!

Ich habe diesen Fehler immer noch in Version 2.0.1.0

[DEPRECATION WARNING]: Skipping task due to undefined Error, in the future this will be a fatal error.. This feature will be removed in a future
release. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
fatal: [xxx.xxx.xxx.xxx]: FAILED! => {"failed": true, "msg": "with_dict expects a dict"}

Ich muss ignore_errors , um es zu umgehen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen