【发布时间】:2019-12-06 11:02:55
【问题描述】:
---
- hosts: leaf-1, leaf-2
vars_files:
- /vars/all.yml
tasks:
- name: collect the vlan databse
raw: "show vlan brief"
register: vlan_db
- name: compare vlan_id(.*)Ports against the vlan_db
set_fact:
fact1: "{{ item.1.vlan_id }}"
fact2: "{{ item.1.sap.inventory_hostname | join(', ') }}"
fact3: "{{ fact1 }}(.*){{ fact2 }}"
failed_when: not vlan_db.stdout is regex(fact3)
when: inventory_hostname in item.1.sap
with_subelements:
- "{{ customers }}"
- services
我从开关收集输出
我想遍历“customer”列表并检查“inventory_hostname”是否列在“services.sap”中
我想我可以通过以下方式做到这一点:
when: inventory_hostname in item.1.sap
-
如果上述检查为真,我想在 fact3 和第一个任务的标准输出之间进行正则表达式比较,如果第一个任务的标准输出中不存在正则表达式,则引发失败:
set_fact: fact1: "{{ item.1.vlan_id }}" fact2: "{{ item.1.sap.inventory_hostname | join(', ') }}" fact3: "{{ fact1 }}(.*){{ fact2 }}" failed_when: not vlan_db.stdout is regex(fact3)
这就像嵌套循环和条件在一起。有没有办法用 Ansible 做到这一点? 我做错了什么?
只是为了确保我的意图是明确的:
- 遍历客户列表中的项目
- 遍历每个客户的服务列表中的项目
- 检查 item.1.sap 是否有与 inventory_hostname 匹配的键
- 如果上述检查为真,则将上述正则表达式模式与第一个任务的输出进行比较。
/vars/all.yml 看起来像这样:
customers:
- name: "cust-1"
l3_vni: "101"
services:
- vlan_id: "10"
vni: "1010"
gw: "10.0.0.254/24"
sap:
leaf-1: ["Eth3"]
leaf-2: ["Eth3"]
- vlan_id: "11"
vni: "1011"
gw: "10.0.1.254/24"
sap:
leaf-1: ["Eth3"]
leaf-2: ["Eth3"]
- name: "cust-2"
l3_vni: "102"
services:
- vlan_id: "20"
vni: "1020"
gw: "20.0.0.254/24"
sap:
leaf-3: ["Eth3", "Eth4"]
leaf-4: ["Eth3"]
- vlan_id: "21"
vni: "1021"
gw: "20.0.1.254/24"
sap:
leaf-3: ["Eth3"]
leaf-4: ["Eth3"]
```
a switch vlan database usually looks like this:
```
leaf-1#show vlan brief
VLAN Name Status Ports
---- -------------------------------- --------- ----------------------
1 default active Eth5
10 cust-1 active Eth3, Eth4
20 cust-2 active Eth1, Eth2
```
error log:
致命:[leaf-1]:失败! => { "msg": "该任务包含一个带有未定义变量的选项。错误是:'fact1' 未定义\n\n错误似乎在 '/vagrant/Ansible Folder Setup/NetAutHardWay/Step4-CICD/vlan_test.yml ':第 23 行,第 7 列,但可能\n位于文件中的其他位置,具体取决于确切的语法问题。\n\n违规行似乎是:\n\n\n - 名称:比较 vlan_id(.*)Ports 与vlan_db\n ^ 这里\n" }
【问题讨论】: