I have two ansible tasks as follows
tasks: - shell: ifconfig -a | sed 's/[ \t].*//;/^\(lo\|\)$/d' register: var1 - debug: var=var1 - shell: ethtool -i {{ item }} | grep bus-info | cut -b 16-22 with_items: var1.stdout_lines register: var2 - debug: var=var2
which is used to get a list of interfaces in a machine (linux) and get the bus address for each. I have one more task as follows in tha same playbook
- name: Binding the interfaces shell: echo {{ item.item }} with_flattened: var2.results register: var3
which I expect to iterate over value from var2 and then print the bus numbers.
var2.results is as follows
"var2": { "changed": true, "msg": "All items completed", "results": [ { "changed": true, "cmd": "ethtool -i br0: | grep bus-info | cut -b 16-22", "delta": "0:00:00.005778", "end": "2015-04-14 20:29:47.122203", "invocation": { "module_args": "ethtool -i br0: | grep bus-info | cut -b 16-22", "module_name": "shell" }, "item": "br0:", "rc": 0, "start": "2015-04-14 20:29:47.116425", "stderr": "", "stdout": "", "warnings": [] }, { "changed": true, "cmd": "ethtool -i enp13s0: | grep bus-info | cut -b 16-22", "delta": "0:00:00.005862", "end": "2015-04-14 20:29:47.359749", "invocation": { "module_args": "ethtool -i enp13s0: | grep bus-info | cut -b 16-22", "module_name": "shell" }, "item": "enp13s0:", "rc": 0, "start": "2015-04-14 20:29:47.353887", "stderr": "", "stdout": "0d:00.0", "warnings": [] }, { "changed": true, "cmd": "ethtool -i enp14s0: | grep bus-info | cut -b 16-22", "delta": "0:00:00.005805", "end": "2015-04-14 20:29:47.576674", "invocation": { "module_args": "ethtool -i enp14s0: | grep bus-info | cut -b 16-22", "module_name": "shell" }, "item": "enp14s0:", "rc": 0, "start": "2015-04-14 20:29:47.570869", "stderr": "", "stdout": "0e:00.0", "warnings": [] }, { "changed": true, "cmd": "ethtool -i enp15s0: | grep bus-info | cut -b 16-22", "delta": "0:00:00.005873", "end": "2015-04-14 20:29:47.875058", "invocation": { "module_args": "ethtool -i enp15s0: | grep bus-info | cut -b 16-22", "module_name": "shell" }, "item": "enp15s0:", "rc": 0, "start": "2015-04-14 20:29:47.869185", "stderr": "", "stdout": "0f:00.0", "warnings": [] }, { "changed": true, "cmd": "ethtool -i enp5s0f1: | grep bus-info | cut -b 16-22", "delta": "0:00:00.005870", "end": "2015-04-14 20:29:48.112027", "invocation": { "module_args": "ethtool -i enp5s0f1: | grep bus-info | cut -b 16-22", "module_name": "shell" }, "item": "enp5s0f1:", "rc": 0, "start": "2015-04-14 20:29:48.106157", "stderr": "", "stdout": "05:00.1", "warnings": [] }, { "changed": true, "cmd": "ethtool -i enp5s0f2: | grep bus-info | cut -b 16-22", "delta": "0:00:00.005863", "end": "2015-04-14 20:29:48.355733", "invocation": { "module_args": "ethtool -i enp5s0f2: | grep bus-info | cut -b 16-22", "module_name": "shell" }, "item": "enp5s0f2:", "rc": 0, "start": "2015-04-14 20:29:48.349870", "stderr": "", "stdout": "05:00.2", "warnings": [] }, { "changed": true, "cmd": "ethtool -i enp5s0f3: | grep bus-info | cut -b 16-22", "delta": "0:00:00.005829", "end": "2015-04-14 20:29:48.591244", "invocation": { "module_args": "ethtool -i enp5s0f3: | grep bus-info | cut -b 16-22", "module_name": "shell" }, "item": "enp5s0f3:", "rc": 0, "start": "2015-04-14 20:29:48.585415", "stderr": "", "stdout": "05:00.3", "warnings": [] }, { "changed": true, "cmd": "ethtool -i enp9s0f0: | grep bus-info | cut -b 16-22", "delta": "0:00:00.005943", "end": "2015-04-14 20:29:48.910992", "invocation": { "module_args": "ethtool -i enp9s0f0: | grep bus-info | cut -b 16-22", "module_name": "shell" }, "item": "enp9s0f0:", "rc": 0, "start": "2015-04-14 20:29:48.905049", "stderr": "", "stdout": "09:00.0", "warnings": [] }, { "changed": true, "cmd": "ethtool -i enp9s0f1: | grep bus-info | cut -b 16-22", "delta": "0:00:00.005863", "end": "2015-04-14 20:29:49.143706", "invocation": { "module_args": "ethtool -i enp9s0f1: | grep bus-info | cut -b 16-22", "module_name": "shell" }, "item": "enp9s0f1:", "rc": 0, "start": "2015-04-14 20:29:49.137843", "stderr": "", "stdout": "09:00.1", "warnings": [] }, { "changed": true, "cmd": "ethtool -i lo: | grep bus-info | cut -b 16-22", "delta": "0:00:00.005856", "end": "2015-04-14 20:29:49.386044", "invocation": { "module_args": "ethtool -i lo: | grep bus-info | cut -b 16-22", "module_name": "shell" }, "item": "lo:", "rc": 0, "start": "2015-04-14 20:29:49.380188", "stderr": "Cannot get driver information: Operation not supported", "stdout": "", "warnings": [] }, { "changed": true, "cmd": "ethtool -i virbr0: | grep bus-info | cut -b 16-22", "delta": "0:00:00.005859", "end": "2015-04-14 20:29:49.632356", "invocation": { "module_args": "ethtool -i virbr0: | grep bus-info | cut -b 16-22", "module_name": "shell" }, "item": "virbr0:", "rc": 0, "start": "2015-04-14 20:29:49.626497", "stderr": "", "stdout": "", "warnings": [] }, { "changed": true, "cmd": "ethtool -i virbr0-nic: | grep bus-info | cut -b 16-22", "delta": "0:00:00.024850", "end": "2015-04-14 20:29:49.901539", "invocation": { "module_args": "ethtool -i virbr0-nic: | grep bus-info | cut -b 16-22", "module_name": "shell" }, "item": "virbr0-nic:", "rc": 0, "start": "2015-04-14 20:29:49.876689", "stderr": "", "stdout": "", "warnings": [] } ]
My objective is to get the value of stdout in each item above for example ("stdout": "09:00.0") . I tried giving something like
- name: Binding the interfaces shell: echo {{ item.item.stdout}} with_flattened: var2.results # with_indexed_items: var2.results register: var3
But this is not giving the bus values in stdout correctly. Appreciate help in listing the variable of variable value in task as given below when the second variable is and indexed list. I am trying to avoid direct index numbering such as item[0] because the number of interfaces are dynamic and direct indexing may result in unexpected outcomes.
Thanks
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.
Ansible loop is used to repeat any task or a part of code multiple times in an Ansible-playbook. It includes the creation of multiple users using the user module, installing multiple packages using apt or yum module or changing permissions on several files or folders using the file module.
Is this what you're looking for:
- hosts: localhost tags: s21 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}}"
Source: Register variables in with_items loop in Ansible playbook
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