iterating over data

Hello,

Given the data below I would like to create a single task that will print the url or the filename without having to specify the hardware (PowerEdge_xxxxx) or the firmware (bios, idrac, etc.).

Any ideas would be very much appreciated.

Thanks,
Hank

Something like:

   - name: Print firmfware info
     debug: msg="item0 {{ item.0 }} item1 {{ item.1.url }}"
     with_indexed_items: "{{firmware}}"

OR:

   - name: Print firmfware info
     debug: msg="item0 {{ item.0 }} item1 {{ item.1.url }}"
     with_dict: "{{firmware}}"

You can write a small filter plugin that gives you the items of dicts (something that simply returns an item.values() or something like that). Then you could do:

vars:

Will create a list of inner dict values inside a list of parent dict’s values

  • firmware_items: “{{ firmware.values() | map(‘get_dict_values’) | list }}”
    tasks:
  • debug: var=item.url
    with_flattened: firmware_items

Alternatively, I wrote a lookup plugin that allows you do chain lookups and make them iterate on each other. Then you can do this:

tasks:

  • debug: item.values.url
    with_recursive:
  • { name: dict, args: firmware }
  • { name: dict, args: “{{item.values}}” }

Lookup plugin is here: https://gist.github.com/hkariti/d07695b4b9c5a68d8c02

Hello Hagai,

This got me going. Thank you.

Is there a way to match a given model (given that I set the ‘Model’ var earlier in the playbook)? I need the firmware and that works perfectly but, I need to limit the firmware that goes to a certain model of server.

Thanks,
Hank

Something like:

  • debug: var=Model

  • debug: msg={{ item.key }}
    when: item.key == ‘idrac’
    with_recursive:

  • { name: dict, args: firmware, “{{ Model }}” }

  • { name: dict, args: “{{item.value}}” }

Here is the output of the above:

TASK: [idrac-firmware | debug var=Model] **************************************
ok: [] => {
“var”: {
“Model”: “PowerEdge_R730xd”
}
}

TASK: [idrac-firmware | debug msg={{ item.key }}] *****************************
skipping: [] => (item={‘key’: ‘bios’, ‘value’: {‘url’: ‘http://downloads.dell.com/FOLDER02797483M/1/BIOS_CNN4X_WN64_2.5.2.EXE’, ‘search’: ‘none’, ‘target_version’: ‘2.5.2’, ‘minimum_version’: ‘none’, ‘filename’: ‘BIOS_CNN4X_WN64_2.5.2.EXE’}})
skipping: [] => (item={‘key’: ‘os_collector’, ‘value’: {‘url’: ‘http://downloads.dell.com/FOLDER02775623M/1/Diagnostics_Application_5W2KP_WN64_OSC_1.1_X10-00.EXE’, ‘search’: ‘none’, ‘target_version’: 1.1000000000000001, ‘minimum_version’: ‘none’, ‘filename’: ‘Diagnostics_Application_5W2KP_WN64_OSC_1.1_X10-00.EXE’}})
skipping: [] => (item={‘key’: ‘bios’, ‘value’: {‘url’: ‘http://downloads.dell.com/FOLDER02868051M/1/BIOS_XR23Y_WN64_1.2.10.EXE’, ‘search’: ‘none’, ‘target_version’: ‘1.2.10’, ‘minimum_version’: ‘none’, ‘filename’: ‘BIOS_XR23Y_WN64_1.2.10.EXE’}})
ok: [] => (item={‘key’: ‘idrac’, ‘value’: {‘url’: ‘http://downloads.dell.com/FOLDER02881013M/1/iDRAC-with-Lifecycle-Controller_Firmware_FM1PC_WN64_2.10.10.10_A00.EXE’, ‘search’: ‘none’, ‘target_version’: ‘2.10.10.10’, ‘minimum_version’: ‘none’, ‘filename’: ‘iDRAC-with-Lifecycle-Controller_Firmware_FM1PC_WN64_2.10.10.10_A00.EXE’}}) => {
“item”: {
“key”: “idrac”,
“value”: {
“filename”: “iDRAC-with-Lifecycle-Controller_Firmware_FM1PC_WN64_2.10.10.10_A00.EXE”,
“minimum_version”: “none”,
“search”: “none”,
“target_version”: “2.10.10.10”,
“url”: “http://downloads.dell.com/FOLDER02881013M/1/iDRAC-with-Lifecycle-Controller_Firmware_FM1PC_WN64_2.10.10.10_A00.EXE”
}
},
“msg”: “idrac”
}
skipping: [] => (item={‘key’: ‘bios’, ‘value’: {‘url’: ‘http://downloads.dell.com/FOLDER02868051M/1/BIOS_XR23Y_WN64_1.2.10.EXE’, ‘search’: ‘none’, ‘target_version’: ‘1.2.10’, ‘minimum_version’: ‘none’, ‘filename’: ‘BIOS_XR23Y_WN64_1.2.10.EXE’}})
ok: [] => (item={‘key’: ‘idrac’, ‘value’: {‘url’: ‘http://downloads.dell.com/FOLDER02881013M/1/iDRAC-with-Lifecycle-Controller_Firmware_FM1PC_WN64_2.10.10.10_A00.EXE’, ‘search’: ‘none’, ‘target_version’: ‘2.10.10.10’, ‘minimum_version’: ‘none’, ‘filename’: ‘iDRAC-with-Lifecycle-Controller_Firmware_FM1PC_WN64_2.10.10.10_A00.EXE’}}) => {
“item”: {
“key”: “idrac”,
“value”: {
“filename”: “iDRAC-with-Lifecycle-Controller_Firmware_FM1PC_WN64_2.10.10.10_A00.EXE”,
“minimum_version”: “none”,
“search”: “none”,
“target_version”: “2.10.10.10”,
“url”: “http://downloads.dell.com/FOLDER02881013M/1/iDRAC-with-Lifecycle-Controller_Firmware_FM1PC_WN64_2.10.10.10_A00.EXE”
}
},
“msg”: “idrac”
}

Do you mean add conditions for each iteration? No, you cant do that currently. Shouldnt be hard, butnI dont have a lot of time to do it myself.

Yes, adding conditions for each iteration. Exactly.

I can get in there and see if I can modify it.

Are you thinking something like this… :

  • debug: msg={{ item.key }}
    with_recursive:
  • { name: dict, args: firmware, conditional: Model } # where Model was set at some past point
  • { name: dict, args: “{{item.value}}”, conditional: ‘idrac’ }

Or something else.

Thanks,
Hank