Подтвердить что ты не робот

Регистрировать переменные в цикле 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
4b9b3361

Ответ 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}}"