40

I've got a dictionary with different names like

vars:
    images:
      - foo
      - bar

Now, I want to checkout repositories and afterwards build docker images only when the source has changed. Since getting the source and building the image is the same for all items except the name I created the tasks with with_items: images and try to register the result with:

register: "{{ item }}"

and also tried

register: "src_{{ item }}"

Then I tried the following condition

when: "{{ item }}|changed"

and

when: "{{ src_item }}|changed"

This always results in fatal: [piggy] => |changed expects a dictionary

So how can I properly save the results of the operations in variable names based on the list I iterate over?

Update: I would like to have something like that:

- 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
0

1 Answer 1

71

So how can I properly save the results of the operations in variable names based on the list I iterate over?

You don't need to. Variables registered for a task that has with_items have different format, they contain results for all 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}}"

3
  • How do you reference the image names from the results?
    – Ken J
    Commented Sep 18, 2017 at 15:36
  • @KenJ last two tasks show that. If you meant something else plz elaborate. Run it and see the output.
    – Kashyap
    Commented Sep 18, 2017 at 17:27
  • 2
    For those who wandered here, the docs are: docs.ansible.com/ansible/latest/user_guide/… Commented Sep 24, 2022 at 4:07

Not the answer you're looking for? Browse other questions tagged or ask your own question.