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
Ansible registers are used when you want to capture the output of a task to a variable. You can then use the value of these registers for different scenarios like a conditional statement, logging etc. The variables will contain the value returned by the task. The common return values are documented in Ansible docs.
No, this is not possible. Ansible (as of current version 2.4) does not allow to register partial output of the module (or several different parts of it). You can register only full result and extract parts of it in the tasks to follow.
To pass a value to nodes, use the --extra-vars or -e option while running the Ansible playbook, as seen below. This ensures you avoid accidental running of the playbook against hardcoded hosts.
The with_ keywords rely on Lookup Plugins - even items is a lookup. The loop keyword is equivalent to with_list, and is the best choice for simple loops. The loop keyword will not accept a string as input, see Ensuring list input for loop: query vs. lookup.
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}}"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With