使用 Ansible 验证数据是否符合既定标准

validate 模块使用验证引擎来验证数据是否符合您预定义的标准。您可以从设备或文件中提取这些数据,根据您定义的标准进行验证,并利用结果识别配置或操作状态漂移,并可以选择采取补救措施。

了解 validate 插件

ansible.utils 集合包含 validate 模块。

要验证数据

  1. 使用 cli_parse 模块引入结构化数据或将您的数据转换为结构化格式。

  2. 定义要测试该数据的标准。

  3. 选择一个验证引擎并测试数据以查看它是否基于所选标准和验证引擎有效。

数据的结构和标准取决于您选择的验证引擎。此处的示例使用 jsonschema ansible.utils 集合中提供的验证引擎。Red Hat Ansible Automation Platform 订阅支持有限使用 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"

在这些任务中,我们有

  1. data 设置为来自 cli_parse 模块的结构化 JSON 数据。

  2. criteria 设置为我们定义的 JSON 标准文件。

  3. 将验证引擎设置为 jsonschema

注意

criteria 选项的值可以是列表,并且应采用所用验证引擎定义的格式。您需要在此示例中安装控制节点上的 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 未处于基于定义标准的所需状态。您可以创建报告或采取进一步措施来进行修复,以根据定义的标准将接口置于所需状态。