仅当 Nexus 交换机上不存在 VLAN 时,才创建 VLAN



我正在尝试创建一个 Ansible 剧本,该手册应该仅在设备上不存在时才在 Cisco Nexus 交换机上创建在文件 VLAN .dat 中定义的 VLAN。

文件 VLAN.dat 包含:

---
vlans:
- { vlan_id: 2, name: TEST }

和 Ansible 文件:

---
- name: Verify and create VLANs
hosts: switches_group
gather_facts: no
vars_files:
- vlans.dat
tasks:
- name: Get Nexus facts
nxos_facts:
register: data
- name: Create new VLANs only
nxos_vlan:
vlan_id: "{{ item.vlan_id }}"
name: "{{ item.name }}"
state:   "{{item.state | default('present') }}"
with_items: "{{ vlans }}"
when:  item.vlan_id not in data.ansible_facts.vlan_list

在 when 语句中,我试图将执行限制为仅当模块收集nxos_factsvlan_list中不存在vlan_id(在文件中定义(的情况下。不幸的是,即使vlan_id已经存在于vlan_list中,它也会被执行,我不知道为什么?

PLAY [Verify and create VLANs]     
TASK [Get Nexus facts] 
ok: [10.1.1.1]
TASK [Create new VLANs only] 
ok: [10.1.1.1] => (item={u'name': u'TEST', u'vlan_id': 2})
TASK [debug] 
skipping: [10.1.1.1]
PLAY RECAP 
10.1.1.1   : ok=2    changed=0    unreachable=0 failed=0

你能帮我解决这个问题或提供一些解决方案,我在这里做错了什么吗?

看来您偶然发现了具有实际类型的 YAML 的副作用。因为在{vlan_id: 2}2 是一个int但列表是字符串。正如您可能想象的那样{{ 1 in ["1"] }}False.

有两种方法可以解决这种情况:通过- { vlan_id: "2" }使vlan_id成为字符串,或者将vlan_id强制为字符串,仅用于测试列表成员身份:

when:  (item.vlan_id|string) not in data.ansible_facts.vlan_list

最新更新