Fehlerbericht
ansible 1.7
Ausführen des Betriebssystems von: OSX 10.9
Verwaltung: Ubuntu 14.04
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.
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.
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
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
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.
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!