Kurz zusammengefasst

Kurz zusammengefasst

Hier ist meine Variablenlistendatei vars/blah.yml:

---
stuff:
 - stuff1: bill
   stuff2: sue

Ich versuche nur, die Werte der Variablen zu erhalten.

Hier ist mein Spielbuch:

  hosts: all
  become: yes
  vars_files:
    - vars/blah.yml
  tasks:

  - name: test
    debug:
      var: "{{ item.stuff1 }} {{ item.stuff2 }}"
    loop :
      - "{{ stuff }}"

Ich erhalte diesen Fehler.

fatal: [node1]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'stuff1'\n\nThe error appears to be in '/home/automation/plays/test1.yml': line 11, 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\n    ^ here\n"}

Kann mir jemand sagen, was ich falsch mache?

Habe die Formatierung der Variablen bearbeitet. Erhalte immer noch die gleichen Ergebnisse.

Antwort1

Kurz zusammengefasst

  loop: "{{ stuff }}"

Ganze Geschichte

Im Gegensatz zum früheren und immer noch weit verbreiteten Standard wendet with_items:ein Bare loop:keine Automatik flatten(level=1)auf die übergebenen Argumente an.

Weitere Informationen zu dieser Funktion finden Sie unter:

Wenn Ihr Beispiel die Verwendungwith_items

  with_items: 
    - "{{ stuff }}"

Die resultierende Liste wäre immer noch genau die, die Sie in Ihrer Datei definiert haben.

Jetzt verwendet mitloop

  loop:
    - "{{ stuff }}"

Sie durchlaufen eine Liste von Listen, die so aussieht (beachten Sie den einzelnen Bindestrich oben im folgenden Beispiel und die Einrückung des restlichen Inhalts: Es handelt sich nicht um einen Tippfehler).

- 
  - stuff1: bill
    stuff2: sue

Das erste Element, das Sie in Ihrer Schleife erhalten, ist also tatsächlich Ihre vollständige Liste in Ihrer Var-Datei.

Um das zu beheben, übergeben Sie die Variable einfach korrekt an loop, d. h.

  loop: "{{ stuff }}"

Antwort2

Das Format Ihrer Variablendatei ist falsch. Die oberste Ebene ist keine Liste, sie sollte so aussehen:

---
stuff:
  - stuff1: bill
    stuff2: sue

Darüber hinaus sollte der Pfad zur Vars-Datei mit einem / vom Ansible-Stammverzeichnis aus beginnen:

vars_files:
  - /vars/blah.yml

verwandte Informationen