'Check if arrays are defined and not empty in ansible

I have the following code

- set_fact:
    MY_HOSTNAME: "SOME VALUE"
    MY_SERVER: "00.00.00.00"
- name: Get MY server
  set_fact:
    MY_SERVER: "{{ groups[MY_HOSTNAME][0] }}"
  when: groups[MY_HOSTNAME] is defined

In the above code, groups[MY_HOSTNAME] is an array. What is the best way to check that groups[MY_HOSTNAME] is defined and also that it is not empty If it is either of that I want the value 00.00.00.00 to be assigned to MY_SERVER



Solution 1:[1]

I don't know if it's version specific, but I'm currently running ansible-2.3.2 on RHEL6 and I had to put quotes around the group name to get it to work for me:

when: groups["GROUP_NAME"] is defined and (groups["GROUP_NAME"]|length>0)

Edit: I couldn't add this as a comment to techraf's answer because I don't have enough reputation.

Solution 2:[2]

list | length filter returns the number of elements. If it is zero, the list is empty.

For a conditional value use if or ternary filter (example in this answer).

For a composite conditional (groups[MY_HOSTNAME]| default([])) | length.

Solution 3:[3]

You can first check if it is indeed a list and then check if it has more than one element:

when: (groups['MY_HOSTNAME'] is defined) and (groups['MY_HOSTNAME'] | type_debug == 'list') and (groups['MY_HOSTNAME'] | length > 0)

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
Solution 2
Solution 3 stackprotector