help processing nested data structure

I am trying to process a nested data structure and can’t find a suitable syntax to let me do it. Ansible only seems to allow one level of looping, or two with sub-elements.

Given a data structure like this:

vars:
vpcs:
name: blah
cidr: 10.10.0.0/19

tiers:

[… more subnets …]

[… more tiers …]

[… more VPCs …]

… how do I do the equivalent of:

for each VPC
for each tier
for each subnet
create subnet

I.e., three nested levels?

I don’t have to do it this way; I can flatten the data structures, but the data structure is naturally nested, so it would be nice to be able to use it in that form.

Yours hopefully, K.

I guess vpcs is also a list, you just forgot the dash?
If so you can go "old" school and user include_tasks with with_items that support many nested levels.

vpcs.yml

Really? Is that my only option, actual separate YAML files with a “subroutine” in each one?

That’s pretty yuck :frowning:

But thanks for the hint. I’ll give it a go.

BTW this would be a solved problem if blocks could be executed with_items; that plus local variables as per 2.8…

Regards, K.

Hullo Kia.

I couldn’t bear to use separate YAML files, so instead I wrote set_fact: loops to create a flat list out of the nested structure. The end result looks something like this:

[
{
vpc: blah

tier: bloo
cidr: 10.10.1.0/19

subnet: subnet1
subnet_cidr: 10.10.1.0/24
}

{
vpc: blah
tier: bloo
cidr: 10.10.1.0/19

subnet: subnet2
subnet_cidr: 10.10.2.0/24
}

{
vpc: blah
tier: glop

cidr: 10.10.1.0/19

subnet: subnet3
subnet_cidr: 10.10.3.0/24
}

{
vpc: blah
tier: glop

cidr: 10.10.1.0/19

subnet: subnet4
subnet_cidr: 10.10.4.0/24
}
[…]

]

This lets me loop over the same list multiple times, taking what I need at each pass, and element has all the info I needs. It’s not as nice as being able to loop over the real nested structure, but it’s close. The main thing is that I can record the info correctly in the nested structure, and generate the list automatically; I don’t have to create all that repetitive data by hand.

BTW the above is indicative, not the real thing. There’s more detail in there in real life :slight_smile:

Regards, K.