使用 Ansible 根据设定标准验证数据
validate 模块使用验证引擎根据您预定义的标准验证数据。您可以从设备或文件中提取此数据,根据您定义的标准对其进行验证,并使用结果来识别配置或操作状态的漂移,并可选择采取补救措施。
了解 validate 插件
ansible.utils 集合包含 validate 模块。
要验证数据
使用 cli_parse 模块提取结构化数据或将数据转换为结构化格式。
定义用于测试数据的标准。
选择验证引擎并测试数据,以查看其是否基于所选标准和验证引擎有效。
数据结构和标准取决于您选择的验证引擎。此处的示例使用 ansible.utils 集合中提供的 jsonschema
验证引擎。Red Hat Ansible 自动化平台订阅支持有限地使用 jsonschema 公共 API,如文档所述。
构造数据
您可以从文件中提取以前构造的数据,或者使用 cli_parse 模块来构造您的数据。
以下示例获取一些网络 (Cisco NXOS) 接口的操作状态,并使用 ansible.netcommon.pyats
解析器将该状态转换为结构化数据。
---
- hosts: nxos
connection: ansible.netcommon.network_cli
gather_facts: false
vars:
ansible_network_os: cisco.nxos.nxos
ansible_user: "changeme"
ansible_password: "changeme"
tasks:
- name: "Fetch interface state and parse with pyats"
ansible.utils.cli_parse:
command: show interface
parser:
name: ansible.netcommon.pyats
register: nxos_pyats_show_interface
- name: print structured interface state data
ansible.builtin.debug:
msg: "{{ nxos_pyats_show_interface['parsed'] }}"
这将产生以下结构化数据。
ok: [nxos] => {
"changed": false,
"parsed": {
"Ethernet2/1": {
"admin_state": "down",
"auto_mdix": "off",
"auto_negotiate": false,
"bandwidth": 1000000,
"beacon": "off"
<--output omitted-->
},
"Ethernet2/10": {
"admin_state": "down",
"auto_mdix": "off",
"auto_negotiate": false,
"bandwidth": 1000000,
"beacon": "off",
<--output omitted-->
}
}
}
有关如何将半结构化数据解析为结构化数据的详细信息,请参阅 使用 Ansible 解析半结构化文本。
定义要验证的标准
此示例使用 jsonschema 验证引擎来解析我们在上一节中创建的 JSON 结构化数据。标准定义了我们希望数据符合的状态。在此实例中,我们可以针对所有接口的期望管理状态 up
进行验证。
本例中 jsonschema
的标准如下
$ cat criteria/nxos_show_interface_admin_criteria.json
{
"type" : "object",
"patternProperties": {
"^.*": {
"type": "object",
"properties": {
"admin_state": {
"type": "string",
"pattern": "up"
}
}
}
}
}
验证数据
现在我们有了结构化数据和标准,我们可以使用 validate 模块来验证这些数据。
以下任务检查接口的当前状态是否与标准文件中定义的期望状态匹配。
- name: Validate interface admin state
ansible.utils.validate:
data: "{{ nxos_pyats_show_interface['parsed'] }}"
criteria:
- "{{ lookup('file', './criteria/nxos_show_interface_admin_criteria.json') | from_json }}"
engine: ansible.utils.jsonschema
ignore_errors: true
register: result
- name: Print the interface names that do not satisfy the desired state
ansible.builtin.debug:
msg: "{{ item['data_path'].split('.')[0] }}"
loop: "{{ result['errors'] }}"
when: "'errors' in result"
在这些任务中,我们有
将
data
设置为来自 cli_parse 模块的结构化 JSON 数据。将
criteria
设置为我们定义的 JSON 标准文件。将验证引擎设置为
jsonschema
。
注意
标准选项的值可以是一个列表,并且应采用所使用的验证引擎定义的格式。您需要在此示例的控制节点上安装 jsonschema。
任务会输出一个错误列表,指示哪些接口的管理值不在 up
状态。
TASK [Validate interface for admin state] ***********************************************************************************************************
fatal: [nxos02]: FAILED! => {"changed": false, "errors": [{"data_path": "Ethernet2/1.admin_state", "expected": "up", "found": "down", "json_path": "$.Ethernet2/1.admin_state", "message": "'down' does not match 'up'", "relative_schema": {"pattern": "up", "type": "string"}, "schema_path": "patternProperties.^.*.properties.admin_state.pattern", "validator": "pattern"}, {"data_path": "Ethernet2/10.admin_state", "expected": "up", "found": "down", "json_path": "$.Ethernet2/10.admin_state", "message": "'down' does not match 'up'", "relative_schema": {"pattern": "up", "type": "string"}, "schema_path": "patternProperties.^.*.properties.admin_state.pattern", "validator": "pattern"}], "msg": "Validation errors were found.\nAt 'patternProperties.^.*.properties.admin_state.pattern' 'down' does not match 'up'. \nAt 'patternProperties.^.*.properties.admin_state.pattern' 'down' does not match 'up'. \nAt 'patternProperties.^.*.properties.admin_state.pattern' 'down' does not match 'up'. "}
...ignoring
TASK [Print the interface names that do not satisfy the desired state] ****************************************************************************
Monday 14 December 2020 11:05:38 +0530 (0:00:01.661) 0:00:28.676 *******
ok: [nxos] => {
"msg": "Ethernet2/1"
}
ok: [nxos] => {
"msg": "Ethernet2/10"
}
这表明根据定义的标准,Ethernet2/1 和 Ethernet2/10 不在期望状态。您可以创建报告或采取进一步措施来补救此问题,以使接口根据定义的标准达到期望状态。