1

I'm new to ansible so i'll try to explain this as best as I can...

I have two lists created from separate json_query results. One of them contains nested lists with two related items each (vm and cluster). The other is just a list of vm's that needs to be compared against. If the vm's match, I need to use the related cluster name in an API call.

Here are sample lists:

      [
            [
                "vm3",
                "cluster1"
            ],
            [
                "vm5",
                "cluster2"
            ],
            [
                "vm9",
                "cluster3"
            ]
        ],
        [
            [
                "vm5"
            ],
            [
                "vm1"
            ],
            [
                "vm3"
            ]
        ]

From the above example, vm5 and vm3 are matches so I would save cluster1 and cluster2 in a list to be used in an API call using a loop. Also, we have many clusters with varying numbers of vm's on each, so actual lists can (and will) vary widely.

I have tried using ansible.builtin.set_fact with a loop but the variable only stores the last iteration. It seems that jinja2 templates might work with nested loops, but I don't know how to store the variable for future use in later API calls.

1 Answer 1

1

Given the data

data:
  - - [vm3, cluster1]
    - [vm5, cluster2]
    - [vm9, cluster3]
  - - [vm5]
    - [vm1]
    - [vm3]

Create the dictionary

vc: "{{ dict(data.0) }}"

gives

vc:
  vm3: cluster1
  vm5: cluster2
  vm9: cluster3

and the list of vm(s) in the dictionary

vm: "{{ data.1 | flatten | select('in', vc) }}"

gives

vm: [vm5, vm3]

Extract the result

result: "{{ vm | map('extract', vc) }}"

gives

result: [cluster2, cluster1]

Example of a complete playbook for testing

- hosts: localhost

  vars:

    data:
      - - [vm3, cluster1]
        - [vm5, cluster2]
        - [vm9, cluster3]
      - - [vm5]
        - [vm1]
        - [vm3]
    vc: "{{ dict(data.0) }}"
    vm: "{{ data.1 | flatten | select('in', vc) }}"
    result: "{{ vm | map('extract', vc) }}"

  tasks:

    - debug:
        var: vc | to_nice_yaml
    - debug:
        var: vm | to_yaml
    - debug:
        var: result | to_yaml
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you, Vladimir, this works perfectly. I had not worked with dictionaries before; I clearly have much to learn.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.