'All combination of 2 lists in ansible

I have 2 variables as a list in ansible

host_list:
    - 1.1.1.1
    - 2.2.2.2

port_list:
    - 443
    - 80

and I want to get the 3rd variable as a list of lists:

all_comb = [[1.1.1.1, 443], [1.1.1.1, 80], [2.2.2.2, 443], [2.2.2.2, 80]]

How can i get it in Ansible?



Solution 1:[1]

you can use the with_nested or a query('nested', listA, listB) loop, see both implementations below:

with_nested:

- name: merge lists
  set_fact:
    merged_list: "{{ merged_list|default([]) + [item] }}"
  with_nested:
  - "{{ host_list }}"
  - "{{ port_list }}"

- name: display result
  debug:
    var: merged_list

with query:

- name: merge lists
  set_fact:
    merged_list: "{{ merged_list|default([]) + [item] }}"
  loop: "{{ query('nested', host_list, port_list) }}"

- name: display result
  debug:
    var: merged_list

result of the latter:

PLAY [localhost] ******************************************************************************************************************************************************************************************************

TASK [merge lists] ****************************************************************************************************************************************************************************************************
ok: [localhost] => (item=[u'1.1.1.1', 443])
ok: [localhost] => (item=[u'1.1.1.1', 80])
ok: [localhost] => (item=[u'2.2.2.2', 443])
ok: [localhost] => (item=[u'2.2.2.2', 80])

TASK [display result] *************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "merged_list": [
        [
            "1.1.1.1", 
            443
        ], 
        [
            "1.1.1.1", 
            80
        ], 
        [
            "2.2.2.2", 
            443
        ], 
        [
            "2.2.2.2", 
            80
        ]
    ]
}

cheers

Solution 2:[2]

Use product filter

all_comb: "{{ host_list|product(port_list) }}"

gives

all_comb:
  - [1.1.1.1, 443]
  - [1.1.1.1, 80]
  - [2.2.2.2, 443]
  - [2.2.2.2, 80]

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 ilias-sp
Solution 2