Регистрировать переменные в цикле in_items в Ansible playbook
У меня есть словарь с разными именами, например
vars:
images:
- foo
- bar
Нет. Я хочу проверить репозитории и впоследствии создавать изображения докеров только тогда, когда источник был изменен.
Поскольку получение источника и построение изображения одинаковы для всех элементов, кроме имени, которое я создал, задание с with_items: images
и попытайтесь зарегистрировать результат с помощью:
register: "{{ item }}"
а также попытался
register: "src_{{ item }}"
Затем я попробовал следующий conditon
when: "{{ item }}|changed"
и
when: "{{ src_item }}|changed"
Это всегда приводит к fatal: [piggy] => |changed expects a dictionary
Итак, как я могу правильно сохранить результаты операций в именах переменных на основе перечислимого списка?
Обновление: мне нравится иметь что-то вроде этого:
- 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
Ответы
Ответ 1
Итак, как я могу правильно сохранить результаты операций в именах переменных на основе перечислимого списка?
Вам не нужно. Переменные, зарегистрированные для задачи с with_items
, имеют разный формат, они содержат результаты для всех элементов.
- 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}}"