I appreciate the immediate help . But my client don't want use python in
the ansible just wanted to know can we use ansible loop and condition
to determine the match group_names?
Thanks
Deepak Kumar
On Thursday, July 20, 2023 at 5:48:51 AM UTC+5:30 Todd Lewis wrote:
> 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 in lookup('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/8645357b-5e61-4918-873d-1f410ea9ea87n%40googlegroups.com.