Ansible: 'dict object' hat kein Attribut in der Klausel 2.3 RC1

Erstellt am 17. März 2017  ·  2Kommentare  ·  Quelle: ansible/ansible

AUSGABETYP
  • Fehlerbericht
KOMPONENTENNAME

Ader

ANSIBLE VERSION
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)]
AUFBAU

Standard

OS / UMWELT

RHEL 6.7

ZUSAMMENFASSUNG

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.

SCHRITTE ZUM REPRODUZIEREN

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
ERWARTETE ERGEBNISSE

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
TATSÄCHLICHE ERGEBNISSE
- Was wirklich passierte? Wenn möglich mit zusätzlicher Ausführlichkeit ausführen (-vvvv)

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
affects_2.3 bug

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 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!

Alle 2 Kommentare

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 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!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen