WarrenG
WarrenG

Reputation: 1850

Ansible: Multiple with items into Jinja template

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

Answers (1)

larsks
larsks

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:

  • The group id is item.0.group_id
  • The port is item.1
  • The CIDR range is 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

Related Questions