Register Variables in Loop in an Ansible Playbook

user3364247 picture user3364247 · Apr 14, 2015 · Viewed 76.8k times · Source

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

Answer

Kashyap picture Kashyap · Apr 14, 2015

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