TL;DR

TL;DR

Aquí está mi archivo de lista de variables vars/blah.yml:

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

Solo intento obtener los valores de las variables.

Aquí está mi libro de jugadas:

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

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

Recibo este error.

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"}

¿Alguien puede decirme qué estoy haciendo mal?

Editó el formato de las variables. Sigo obteniendo los mismos resultados.

Respuesta1

TL;DR

  loop: "{{ stuff }}"

Historia completa

A diferencia del primero y todavía ampliamente utilizado por defecto with_items:, a bare loop:no aplica una automática flatten(level=1)a los argumentos pasados.

Para más información sobre esta característica, puedes ver:

Si su ejemplo estaba usandowith_items

  with_items: 
    - "{{ stuff }}"

la lista resultante seguirá siendo exactamente la que definiste en tu archivo.

Ahora usado conloop

  loop:
    - "{{ stuff }}"

está recorriendo una lista de listas que se parece a (tenga en cuenta el guión solo en la parte superior del ejemplo siguiente y la sangría del resto del contenido: no es un error tipográfico).

- 
  - stuff1: bill
    stuff2: sue

Entonces, el primer elemento que obtienes en tu bucle es en realidad tu lista completa en tu archivo var.

Para solucionarlo, simplemente pase la variable correctamente a loop, es decir

  loop: "{{ stuff }}"

Respuesta2

El formato de su archivo de variables es incorrecto. El nivel superior no es una lista, debería verse así:

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

Además, la ruta al archivo vars debe comenzar con / desde la raíz de Ansible:

vars_files:
  - /vars/blah.yml

información relacionada