Deepak,
Here's a playbook that demonstrates one way to do it. I tried lots of
incorrect Jinja2 expressions that failed to achieve the final output
before going back to iterative loops. It feels like the subelements
lookup should be part of the solution, and that is shown below. However,
it's actually more straightforward to do old-school looping over your
original data to find the matching group names, and that's what the
second set_fact task does.
If there is a way to express this with Jinja2 filters, it's unintuitive
enough to me that I wouldn't want to maintain it anyway. I can read the
loops and make some sense out of it, so that's the way I'd go.
[utoddl@tango ansible]$*cat test-subelements3.yml*
---
- name: Demo set_fact over subelements
hosts: localhost
gather_facts: false
vars:
*vm_name*: NED-DEV601-X
*vm_drs_groups*:
- group_name: VM2-on-dev
vms:
- deep-test
- NED-DEV601-X
type: vm
- group_name: VM2-on-uat
vms:
- NED-TST601-X
type: vm
- group_name: VM2-on-qa
vms:
- deep-test
- NED-DEV601-X
type: vm
tasks:
- name: Show the list generated by the subelements lookup
ansible.builtin.debug:
msg: "{{lookup('subelements', *vm_drs_groups*, 'vms') }}"
- name: Iterate over subelements to gather the group_names for {{*vm_name*
}}
ansible.builtin.set_fact:
match_vm_group: |
{% set matching_groups = [] %}
{% for vm_by_group_name inlookup('subelements', *vm_drs_groups*,
'vms') %}
{% if vm_by_group_name[1] ==*vm_name* %}
{% set _ =
matching_groups.append(vm_by_group_name[0].group_name) %}
{% endif %}
{% endfor %}{{ matching_groups }}
- name: Same thing without subelements
ansible.builtin.set_fact:
match_vm_group: |
{% set matching_groups = [] %}
{% for vm_drs_group in*vm_drs_groups* %}
{% if*vm_name* in vm_drs_group.vms %}
{% set _ = matching_groups.append(vm_drs_group.group_name) %}
{% endif %}
{% endfor %}{{ matching_groups }}
[utoddl@tango ansible]$*ANSIBLE_STDOUT_CALLBACK=yaml ansible-playbook
test-subelements3.yml -v*
Using /etc/ansible/ansible.cfg as config file
PLAY [Demo set_fact over subelements]
***********************************************************
TASK [Show the list generated by the subelements lookup]
****************************************
ok: [localhost] =>
msg:
- - group_name: VM2-on-dev
type: vm
- deep-test
- - group_name: VM2-on-dev
type: vm
- NED-DEV601-X
- - group_name: VM2-on-uat
type: vm
- NED-TST601-X
- - group_name: VM2-on-qa
type: vm
- deep-test
- - group_name: VM2-on-qa
type: vm
- NED-DEV601-X
TASK [Iterate over subelements to gather the group_names for NED-DEV601-X]
**********************
ok: [localhost] => changed=false
ansible_facts:
match_vm_group:
- VM2-on-dev
- VM2-on-qa
TASK [Same thing without subelements]
***********************************************************
ok: [localhost] => changed=false
ansible_facts:
match_vm_group:
- VM2-on-dev
- VM2-on-qa
PLAY RECAP
**************************************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
Cheers,
--
Todd
On 7/19/23 7:31 AM, Deepak B K wrote:
Hi Team,
I am trying to loop with a condition to match vm_name for all the VM
groups I see that the loop stops at the first instance match . I need
help how can I run the loop for all the vm group name in the variable
output to match vm_name and extract the match group names in the list
for example:
"vm_drs_groups": "“[{'group_name': VM2-on-dev', 'vms': ['deep-test',
'NED-DEV601-X'], 'type': 'vm'}, {'group_name': 'VM2-on-uat', 'vms':
['NED-TST601-X'], 'type': 'vm'}, {'group_name': VM2-on-qa', 'vms':
['deep-test', 'NED-DEV601-X'], 'type': 'vm'}
}
If vm_name = 'NED-DEV601-X' I have two match group name but my logic
stops after the first match how can I search for all the groups in
the register variable.
- name: set fact specific VM group
ansible.builtin.set_fact:
vm_drs_groups: “{{
group_info.drs_group_info[vcenter_env.cluster] | selectattr('type',
'==', "vm" ) | list }}”
- name: "Set facts to specific VM groups for matching vm name"
ansible.builtin.set_fact:
match_vm_group: "{{ item.group_name }}"
when: item | regex_search(vm_name)
loop: "{{ vm_drs_groups }}"
I appreciate any help.
Thanks and Regards,
Deepak Kumar
--
You received this message because you are subscribed to the Google Groups "Ansible
Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/4a5551ca-7d30-f9f9-4538-1270b158b2b0%40gmail.com.