我正在尝试创建一个 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_facts
vlan_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