Register variables in with_items loop in Ansible playbook

48,448

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}}"

Share:
48,448
soupdiver
Author by

soupdiver

Updated on January 28, 2020

Comments

  • soupdiver
    soupdiver over 4 years

    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
    
  • Ken J
    Ken J over 6 years
    How do you reference the image names from the results?
  • Kashyap
    Kashyap over 6 years
    @KenJ last two tasks show that. If you meant something else plz elaborate. Run it and see the output.