J'ai un dictionnaire avec des noms différents comme
vars:
images:
- foo
- bar
Non, je souhaite extraire les référentiels et ensuite créer des images Docker uniquement lorsque la source a changé. Depuis l'obtention de la source et la construction de l'image est la même pour tous les éléments, sauf le nom, j'ai créé les tâches avec with_items: images
et essayez d'enregistrer le résultat avec:
register: "{{ item }}"
et a également essayé
register: "src_{{ item }}"
Ensuite, j'ai essayé la condition suivante
when: "{{ item }}|changed"
et
when: "{{ src_item }}|changed"
Cela se traduit toujours par fatal: [piggy] => |changed expects a dictionary
Alors, comment puis-je enregistrer correctement les résultats des opérations dans des noms de variables basés sur la liste sur laquelle je répète?
Mise à jour: j'aimerais avoir quelque chose comme ça:
- 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
Alors, comment puis-je enregistrer correctement les résultats des opérations dans des noms de variables basés sur la liste sur laquelle je répète?
Vous n'en avez pas besoin. Variables enregistrées pour une tâche qui a with_items
ont un format différent, ils contiennent des résultats pour tous les éléments.
- 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}}"