Ader
ansible 2.3.0.0 (stable-2.3 923c9ef17c) last updated 2017/03/17 09:12:40 (GMT +1000)
config file = /apps/dev/playbook/jordan/mr-ansible/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.7.12 (default, Sep 23 2016, 14:23:49) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]
Standard
RHEL 6.7
Dies ist möglicherweise kein Fehler, sondern nur etwas, mit dem ich bei älteren Versionen durchgekommen bin, aber mit Ansible 2.3 RC1, wenn ich überprüfe, ob eine von einem Modul registrierte Variable (mit einer when-Klausel) definiert ist, und anschließend einen Sub-Dict-Wert erhalte scheitern in 2.3, während es in 2.2 und darunter gut funktioniert. Dies ist insbesondere dann der Fall, wenn das Modul, das die Variable registriert, aus irgendeinem Grund übersprungen wird und eine nachfolgende Task prüft, ob die Variable definiert ist, und dann den Unterschlüssel erhält.
Beispielspielbuch
---
- name: test
hosts: localhost
connection: local
tasks:
- name: module that won't run
stat:
path: /apps/tmp
register: test
when: False
- name: debug of var
debug:
var: test
- name: test with conditional
debug:
msg: A
when: test is defined and test.stat.exists
Bei Verwendung von Ansible 2.2.1.0
ansible 2.2.1.0
config file = /cygdrive/d/dev/jordan/ansible.cfg
configured module search path = Default w/o overrides
PLAY [test] ********************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [module that won't run] ***************************************************
task path: /cygdrive/d/dev/jordan/2.3tests.yml:7
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional check failed", "skipped": true}
TASK [debug of var] ************************************************************
task path: /cygdrive/d/dev/jordan/2.3tests.yml:13
ok: [localhost] => {
"test": {
"changed": false,
"skip_reason": "Conditional check failed",
"skipped": true
}
}
TASK [test with conditional] ***************************************************
task path: /cygdrive/d/dev/jordan/2.3tests.yml:17
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional check failed", "skipped": true}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
PLAY [test] ************************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************
Friday 17 March 2017 15:20:42 +1000 (0:00:00.039) 0:00:00.039 **********
ok: [localhost]
META: ran handlers
TASK [module that won't run] *******************************************************************************************************************************************************
task path: /apps/dev/playbook/jordan/mr-ansible/test.yml:7
Friday 17 March 2017 15:20:44 +1000 (0:00:01.093) 0:00:01.133 **********
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False", "skipped": true}
TASK [debug of var] ****************************************************************************************************************************************************************
task path: /apps/dev/playbook/jordan/mr-ansible/test.yml:13
Friday 17 March 2017 15:20:44 +1000 (0:00:00.012) 0:00:01.145 **********
ok: [localhost] => {
"changed": false,
"test": {
"changed": false,
"skip_reason": "Conditional result was False",
"skipped": true
}
}
TASK [test with conditional] *******************************************************************************************************************************************************
task path: /apps/dev/playbook/jordan/mr-ansible/test.yml:17
Friday 17 March 2017 15:20:44 +1000 (0:00:00.034) 0:00:01.180 **********
fatal: [localhost]: FAILED! => {"failed": true, "msg": "The conditional check 'test is defined and test.stat.exists' failed. The error was: error while evaluating conditional (test is defined and test.stat.exists): 'dict object' has no attribute 'stat'\n\nThe error appears to have been in '/apps/dev/playbook/jordan/mr-ansible/test.yml': line 17, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: test with conditional\n ^ here\n"}
PLAY RECAP *************************************************************************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=1
Hallo!
Vielen Dank für Ihre Übermittlung an Ansible. Es bedeutet uns aufrichtig viel.
Wir glauben, dass das von Ihnen eingereichte Ticket etwas missverstanden wird, da eines etwas anders funktioniert als angegeben.
In Zukunft könnte dies ein Thema sein, das besser für die Benutzerliste geeignet ist. Sie können es auch hier posten, wenn Sie weitere Hilfe zu den oben genannten Themen benötigen.
Da Sie die 'stat'-Aufgabe überspringen, erhalten Sie immer noch test
als definiertes Wörterbuch, aber es gibt keinen stat
Schlüssel, weshalb Sie die RICHTIGE Fehlermeldung erhalten. Um solche Probleme zu vermeiden, benötigen Sie:
when: test is defined and 'stat' in test and test.stat.exists
Nochmals vielen Dank dafür und Ihr Interesse an Ansible!
Halbiertes Commit, das dieses Verhalten geändert hat https://github.com/ansible/ansible/commit/81aa12eb1b5a2b50ac9234ca0b05c015af88a845
Verwandte Ausgabe https://github.com/ansible/ansible/issues/18514
Hilfreichster Kommentar
Mögliches Missverständnis
Hallo!
Vielen Dank für Ihre Übermittlung an Ansible. Es bedeutet uns aufrichtig viel.
Wir glauben, dass das von Ihnen eingereichte Ticket etwas missverstanden wird, da eines etwas anders funktioniert als angegeben.
In Zukunft könnte dies ein Thema sein, das besser für die Benutzerliste geeignet ist. Sie können es auch hier posten, wenn Sie weitere Hilfe zu den oben genannten Themen benötigen.
Da Sie die 'stat'-Aufgabe überspringen, erhalten Sie immer noch
test
als definiertes Wörterbuch, aber es gibt keinenstat
Schlüssel, weshalb Sie die RICHTIGE Fehlermeldung erhalten. Um solche Probleme zu vermeiden, benötigen Sie:Nochmals vielen Dank dafür und Ihr Interesse an Ansible!