f1rstsurf
f1rstsurf

Reputation: 647

Ansible when conditional with variable and item

I'm having hard time trying to figure it out what I'm doing wrong with my Ansible playbook.

I've got a bunch of tasks, which define or not some variables according to context, depending of the result, some task will be ignored or not.

For this specific case, I check if a VlanID already exists, if it doesn't then I create one, and retrieve the new VlanID from the result.

Here is the playbook :

---
#Tasks for portGroup_add
- name: Get all portgroups in dvswitch vDS
  community.vmware.vmware_dvs_portgroup_find:
    hostname: "{{ vcenter_server }}"
    username: "{{ vcenter_user }}"
    password: "{{ vcenter_pass }}"
    dvswitch: "{{ vcenter_dvSwitch }}"
    validate_certs: False
  register: portGroup_infos
  when: (OLD_VLANID is not defined) or (OLD_VLANID|length < 1)

  #Get last VLAN ID for HDS client, and set VLANID + 1
- name: get portGroup_infos
  set_fact:
    VLANID: "{{ item.vlan_id }}"
  with_items: "{{ portGroup_infos.dvs_portgroups}}"
  when:
    - (portGroup_infos is defined) and (portGroup_infos|length > 0)
    - item.name | regex_search("\(HDS :\s*")

While everything is working pretty well for most of the tasks, this one fires the following error :

The conditional check 'item.name | regex_search("\(HDS :\s*")' failed. 
The error was: error while evaluating conditional (item.name | regex_search("\(HDS :\s*")): 'item' is undefined

Which is pretty obvious, because the dict portGroup_infos, is not defined.

In order to get the new VlanID, I'm using a "when" conditionnal , which check if in the item, the value "(HDS :" , is present.

But I don't want the task to launch if the portGroup_infos variable defined above is not set, I though I'd should use nested "when", but can't succeed.

Ansible version : 2.10.7 python version : 3.7.3

Thank you for your help.

Upvotes: 1

Views: 1448

Answers (1)

Vladimir Botka
Vladimir Botka

Reputation: 68034

Put both tasks into a block, e.g.

- block:
    - name: Get all portgroups in dvswitch vDS

      ...

    - name: get portGroup_infos

      ...

  when: OLD_VLANID|default('')|length == 0

Upvotes: 1

Related Questions