Проверка данных по заданным критериям с помощью Ansible
Модуль validate проверяет данные по предварительно определенным критериям с помощью движка валидации. Вы можете получить эти данные с устройства или файла, проверить их по заданным критериям и использовать результаты для выявления отклонений в конфигурации или операционном состоянии, а также, при необходимости, принять корректирующие меры.
Изучение плагина валидации
Коллекция ansible.utils включает модуль validate.
Для проверки данных:
- Извлеките структурированные данные или преобразуйте данные в структурированный формат с помощью модуля cli_parse.
- Определите критерии для проверки данных.
- Выберите движок валидации и проверьте данные на соответствие выбранным критериям и движку валидации.
Структура данных и критериев зависит от выбранного движка валидации. В приведенных примерах используется движок валидации jsonschema, предоставляемый в коллекции ansible.utils. Подписка Red Hat Ansible Automation Platform поддерживает ограниченное использование публичных API jsonschema, как документировано.
Структурирование данных
Вы можете извлечь предварительно структурированные данные из файла или использовать модуль 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устанавливается в структурированные данные JSON из модуля cli_parse. - Значение
criteriaустанавливается в файл критериев JSON, который мы определили. - Движок валидации устанавливается в
jsonschema.
Примечание
Значение параметра criteria может быть списком и должно быть в формате, определенном используемым движком валидации. Для этого примера необходимо установить jsonschema на контрольном узле.
Задачи выдают список ошибок, указывающих на интерфейсы, у которых значение admin не соответствует состоянию 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 не находятся в желаемом состоянии на основе определенных критериев. Вы можете создать отчет или принять дальнейшие действия для исправления этого, чтобы привести интерфейсы к желаемому состоянию на основе определенных критериев.
© 2012–2018 Michael DeHaan
© 2018–2024 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/latest/network/user_guide/validate.html