tutorial tower source playbook open example ansible

tower - Ansible with_items cuando el artículo está definido



ansible tutorial (2)

Ansible 1.9.4. Intento ejecutar alguna tarea solo para los hosts, cuando se define alguna variable, funciona bien, pero no funciona con la sentencia with_items.

- debug: var=symlinks when: symlinks is defined - name: Create other symlinks file: src={{ item.src }} dest={{ item.dest }} state=link with_items: "{{ symlinks }}" when: symlinks is defined

Pero me sale:

TASK: [app/symlinks | debug var=symlinks] ********************* skipping: [another-host-yet] TASK: [app/symlinks | Create other symlinks] ****************** fatal: [another-host-yet] => with_items expects a list or a set

Tal vez estoy haciendo algo mal? Lo siento por mi ingles


La razón de este comportamiento es que las condiciones funcionan de manera diferente dentro de los bucles. Si se definió un bucle, la condición se evalúa para cada elemento mientras se repite sobre los elementos. Pero el bucle en sí requiere una lista válida.

Esto también se menciona en los documentos :

Tenga en cuenta que al combinar cuándo con with_items (consulte Loops ), tenga en cuenta que la instrucción when se procesa por separado para cada elemento. Esto es por diseño:

tasks: - command: echo {{ item }} with_items: [ 0, 2, 4, 6, 8, 10 ] when: item > 5

Creo que esta es una mala elección de diseño y para esta funcionalidad deberían haber introducido algo como with_when .

Como ya se ha dado cuenta, puede usar una lista vacía de manera predeterminada.

with_items: "{{ symlinks | default([]) }}"

Finalmente, si la lista se carga dinámicamente desde una var, digamos x , use:

with_items: "{{ symlinks[x|default('''')] | default([])}}"

Esto se establecerá de forma predeterminada en una lista vacía cuando ''x'' no esté definido.


with_items: "{{ symlinks | default([]) }}"