loops - Registre variables en el bucle with_items en el libro de jugadas de Ansible
ansible with_items (1)
Tengo un diccionario con diferentes nombres como
vars:
images:
- foo
- bar
No, quiero retirar repositorios y luego construir imágenes acoplables solo cuando la fuente ha cambiado.
Dado que obtener la fuente y construir la imagen es la misma para todos los elementos, excepto el nombre, creé las tareas con
with_items: images
e intento registrar el resultado con:
register: "{{ item }}"
y también probé
register: "src_{{ item }}"
Luego probé la siguiente condición
when: "{{ item }}|changed"
y
when: "{{ src_item }}|changed"
Esto siempre resulta
fatal: [piggy] => |changed expects a dictionary
Entonces, ¿cómo puedo guardar correctamente los resultados de las operaciones en nombres de variables basados en la lista que repito?
Actualización: me gustaría tener algo así:
- hosts: all
vars:
images:
- foo
- bar
tasks:
- name: get src
git:
repo: [email protected]/repo.git
dest: /tmp/repo
register: "{{ item }}_src"
with_items: images
- name: build image
shell: "docker build -t repo ."
args:
chdir: /tmp/repo
when: "{{ item }}_src"|changed
register: "{{ item }}_image"
with_items: images
- name: push image
shell: "docker push repo"
when: "{{ item }}_image"|changed
with_items: images
Entonces, ¿cómo puedo guardar correctamente los resultados de las operaciones en nombres de variables basados en la lista que repito?
No necesitas hacerlo.
Las variables registradas para una tarea que tiene
with_items
tienen un formato diferente, contienen resultados para todos los elementos.
- hosts: localhost
gather_facts: no
vars:
images:
- foo
- bar
tasks:
- shell: "echo result-{{item}}"
register: "r"
with_items: "{{ images }}"
- debug: var=r
- debug: msg="item.item={{item.item}}, item.stdout={{item.stdout}}, item.changed={{item.changed}}"
with_items: "{{r.results}}"
- debug: msg="Gets printed only if this item changed - {{item}}"
when: item.changed == true
with_items: "{{r.results}}"