Reputation: 1850
I have the following (solution copied from another thread):
- hosts: localhost
gather_facts: false
vars:
sec_group_info_output:
security_groups:
- group_id: sg-123456
tags:
vpn_ports: "5432,22,53"
- group_id: sg-987654
tags:
vpn_ports: "22"
- group_id: sg-18374923
tags:
vpn_ports: "22,3389"
tasks:
- set_fact:
vpn_groups: "{{ vpn_groups + [{'group_id': item.group_id, 'ports': item.tags.vpn_ports.split(',')}] }}"
vars:
vpn_groups: []
with_items: "{{ sec_group_info_output | json_query('security_groups') }}"
- debug:
msg: "open port {{ item.1 }} for group {{ item.0.group_id }}"
loop: "{{ vpn_groups|subelements('ports') }}"
The vpn_groups structure looks like this:
[
{
"group_id": "sg-123456",
"ports": [
"5432",
"22",
"53"
]
},
{
"group_id": "sg-987654",
"ports": [
"22"
]
},
{
"group_id": "sg-18374923",
"ports": [
"22",
"3389"
]
}
]
The output of my debug:
TASK [debug] *******************************************************************
ok: [localhost] => (item=[{'group_id': 'sg-123456', 'ports': ['5432', '22', '53']}, '5432']) => {
"msg": "open port 5432 for group sg-123456"
}
ok: [localhost] => (item=[{'group_id': 'sg-123456', 'ports': ['5432', '22', '53']}, '22']) => {
"msg": "open port 22 for group sg-123456"
}
ok: [localhost] => (item=[{'group_id': 'sg-123456', 'ports': ['5432', '22', '53']}, '53']) => {
"msg": "open port 53 for group sg-123456"
}
ok: [localhost] => (item=[{'group_id': 'sg-987654', 'ports': ['22']}, '22']) => {
"msg": "open port 22 for group sg-987654"
}
ok: [localhost] => (item=[{'group_id': 'sg-18374923', 'ports': ['22', '3389']}, '22']) => {
"msg": "open port 22 for group sg-18374923"
}
ok: [localhost] => (item=[{'group_id': 'sg-18374923', 'ports': ['22', '3389']}, '3389']) => {
"msg": "open port 3389 for group sg-18374923"
}
This works well, but I need to introduce values from another variable in perhaps multiple with_items
or with_nested
. I have a variable which looks like this:
cidr_ranges: >
10.1.0.0/16,
10.3.0.0/16,
10.4.0.0/16
Looking at my earlier debug I would need the output to look something like:
"msg": "open port 5432 for group sg-123456 for cidr 10.1.0.0/16"
"msg": "open port 5432 for group sg-123456 for cidr 10.2.0.0/16"
"msg": "open port 5432 for group sg-123456 for cidr 10.3.0.0/16"
"msg": "open port 22 for group sg-123456 for cidr 10.1.0.0/16"
"msg": "open port 22 for group sg-123456 for cidr 10.2.0.0/16"
"msg": "open port 22 for group sg-123456 for cidr 10.2.0.0/16"
"msg": "open port 53 for group sg-123456 for cidr 10.1.0.0/16"
"msg": "open port 53 for group sg-123456 for cidr 10.2.0.0/16"
"msg": "open port 53 for group sg-123456 for cidr 10.3.0.0/16"
"msg": "open port 22 for group sg-987654 for cidr 10.1.0.0/16"
"msg": "open port 22 for group sg-987654 for cidr 10.2.0.0/16"
"msg": "open port 22 for group sg-987654 for cidr 10.3.0.0/16"
"msg": "open port 22 for group sg-18374923 for cidr 10.1.0.0/16"
"msg": "open port 22 for group sg-18374923 for cidr 10.2.0.0/16"
"msg": "open port 22 for group sg-18374923 for cidr 10.3.0.0/16"
"msg": "open port 3389 for group sg-18374923 for cidr 10.1.0.0/16"
"msg": "open port 3389 for group sg-18374923 for cidr 10.2.0.0/16"
"msg": "open port 3389 for group sg-18374923 for cidr 10.3.0.0/16"
I tried the below but this did not work:
- debug:
msg: "open port {{ item.1 }} for group {{ item.0.group_id }}"
with_nested:
- "{{ vpn_groups|subelements('ports') }}"
- "{{ cidr_ranges }}"
Upvotes: 0
Views: 259
Reputation: 311576
You're very close! Your life will be easier if cidr_ranges
is a list, rather than a comma-delimited string:
cidr_ranges:
- 10.1.0.0/16
- 10.3.0.0/16
- 10.4.0.0/16
Then your loop
construct is actually correct, but you need to pay attention to the structure of the item
variable. Let's simplify it like this:
- debug:
msg: "{{ item }}"
with_nested:
- "{{ vpn_groups|subelements('ports') }}"
- "{{ cidr_ranges }}"
This will give us output like:
ok: [localhost] => (item=[{'group_id': 'sg-123456', 'ports': ['5432', '22', '53']}, '5432', '10.1.0.0/16']) => {
"msg": [
{
"group_id": "sg-123456",
"ports": [
"5432",
"22",
"53"
]
},
"5432",
"10.1.0.0/16"
]
}
So:
item.0.group_id
item.1
item.2
Giving us:
- debug:
msg: "open port {{ item.1 }} for group {{ item.0.group_id }} for cidr {{ item.2 }}"
with_nested:
- "{{ vpn_groups|subelements('ports') }}"
- "{{ cidr_ranges }}"
Which ouputs:
TASK [debug] *******************************************************************
ok: [localhost] => (item=[{'group_id': 'sg-123456', 'ports': ['5432', '22', '53']}, '5432', '10.1.0.0/16']) => {
"msg": "open port 5432 for group sg-123456 for cidr 10.1.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-123456', 'ports': ['5432', '22', '53']}, '5432', '10.3.0.0/16']) => {
"msg": "open port 5432 for group sg-123456 for cidr 10.3.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-123456', 'ports': ['5432', '22', '53']}, '5432', '10.4.0.0/16']) => {
"msg": "open port 5432 for group sg-123456 for cidr 10.4.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-123456', 'ports': ['5432', '22', '53']}, '22', '10.1.0.0/16']) => {
"msg": "open port 22 for group sg-123456 for cidr 10.1.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-123456', 'ports': ['5432', '22', '53']}, '22', '10.3.0.0/16']) => {
"msg": "open port 22 for group sg-123456 for cidr 10.3.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-123456', 'ports': ['5432', '22', '53']}, '22', '10.4.0.0/16']) => {
"msg": "open port 22 for group sg-123456 for cidr 10.4.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-123456', 'ports': ['5432', '22', '53']}, '53', '10.1.0.0/16']) => {
"msg": "open port 53 for group sg-123456 for cidr 10.1.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-123456', 'ports': ['5432', '22', '53']}, '53', '10.3.0.0/16']) => {
"msg": "open port 53 for group sg-123456 for cidr 10.3.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-123456', 'ports': ['5432', '22', '53']}, '53', '10.4.0.0/16']) => {
"msg": "open port 53 for group sg-123456 for cidr 10.4.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-987654', 'ports': ['22']}, '22', '10.1.0.0/16']) => {
"msg": "open port 22 for group sg-987654 for cidr 10.1.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-987654', 'ports': ['22']}, '22', '10.3.0.0/16']) => {
"msg": "open port 22 for group sg-987654 for cidr 10.3.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-987654', 'ports': ['22']}, '22', '10.4.0.0/16']) => {
"msg": "open port 22 for group sg-987654 for cidr 10.4.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-18374923', 'ports': ['22', '3389']}, '22', '10.1.0.0/16']) => {
"msg": "open port 22 for group sg-18374923 for cidr 10.1.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-18374923', 'ports': ['22', '3389']}, '22', '10.3.0.0/16']) => {
"msg": "open port 22 for group sg-18374923 for cidr 10.3.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-18374923', 'ports': ['22', '3389']}, '22', '10.4.0.0/16']) => {
"msg": "open port 22 for group sg-18374923 for cidr 10.4.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-18374923', 'ports': ['22', '3389']}, '3389', '10.1.0.0/16']) => {
"msg": "open port 3389 for group sg-18374923 for cidr 10.1.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-18374923', 'ports': ['22', '3389']}, '3389', '10.3.0.0/16']) => {
"msg": "open port 3389 for group sg-18374923 for cidr 10.3.0.0/16"
}
ok: [localhost] => (item=[{'group_id': 'sg-18374923', 'ports': ['22', '3389']}, '3389', '10.4.0.0/16']) => {
"msg": "open port 3389 for group sg-18374923 for cidr 10.4.0.0/16"
}
PLAY RECAP *********************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Upvotes: 1