ntc-ansible - это модуль для работы с сетевым оборудованием, который не только выполняет команды на оборудовании, но и обрабатывает вывод команд и преобразует с помощью .
Этот модуль не входит в число core модулей Ansible, поэтому его нужно установить.
Но прежде нужно указать Ansible, где искать сторонние модули. Указывается путь в файле ansible.cfg:
[defaults] inventory = ./myhosts remote_user = cisco ask_pass = True library = ./library
После этого нужно клонировать репозиторий ntc-ansible, находясь в каталоге library:
[~/pyneng_course/chapter15/library] $ git clone https://github.com/networktocode/ntc-ansible --recursive Cloning into 'ntc-ansible'... remote: Counting objects: 2063, done. remote: Compressing objects: 100% (5/5), done. remote: Total 2063 (delta 1), reused 0 (delta 0), pack-reused 2058 Receiving objects: 100% (2063/2063), 332.15 KiB | 334.00 KiB/s, done. Resolving deltas: 100% (1157/1157), done. Checking connectivity... done. Submodule 'ntc-templates' (https://github.com/networktocode/ntc-templates) registered for path 'ntc-templates' Cloning into 'ntc-templates'... remote: Counting objects: 902, done. remote: Compressing objects: 100% (34/34), done. remote: Total 902 (delta 16), reused 0 (delta 0), pack-reused 868 Receiving objects: 100% (902/902), 161.11 KiB | 0 bytes/s, done. Resolving deltas: 100% (362/362), done. Checking connectivity... done. Submodule path 'ntc-templates': checked out '89c57342b47c9990f0708226fb3f268c6b8c1549'
А затем установить зависимости модуля:
pip install ntc-ansible
При установке зависимостей может появиться ошибка:
No matching distribution found for textfsm==1.0.1 (from pyntc->ntc-ansible)
Ее можно игнорировать, если модуль textfsm установлен.
Если при установке возникнут другие проблемы, посмотрите другие варианты установки в .
Так как в текущей версии Ansible уже есть модули, которые работают с сетевым оборудованием и позволяют выполнять команды, из всех возможностей ntc-ansible наиболее полезной будет отправка команд show и получение структурированного вывода. За это отвечает модуль ntc_show_command.
Модуль использует netmiko для подключения к оборудованию (netmiko должен быть установлен) и, после выполнения команды, преобразует вывод команды show с помощью TextFSM в структурированный вывод (список словарей).
Преобразование будет выполняться в том случае, если в файле index была найдена команда, и для команды был найден шаблон.
Как и с предыдущими сетевыми модулями, в ntc-ansible нужно указывать ряд параметров для подключения:
Пример playbook 1_ntc_ansible.yml:
--- - name: Run show commands on router hosts: 192.168.100.1 gather_facts: false connection: local tasks: - name: Run sh ip int br ntc_show_command: connection: ssh platform: "cisco_ios" command: "sh ip int br" host: "{{ inventory_hostname }}" username: "cisco" password: "cisco" template_dir: "library/ntc-ansible/ntc-templates/templates" register: result - debug: var=result
Результат выполнения playbook:
$ ansible-playbook 1_ntc-ansible.yml
В переменной response находится структурированный вывод в виде списка словарей. Ключи в словарях получены на основании переменных, которые описаны в шаблоне library/ntc-ansible/ntc-templates/templates/cisco_ios_show_ip_int_brief.template (единственное отличие - регистр):
Value INTF (\S+) Value IPADDR (\S+) Value STATUS (up|down|administratively down) Value PROTO (up|down) Start ^${INTF}\s+${IPADDR}\s+\w+\s+\w+\s+${STATUS}\s+${PROTO} -> Record
Для того, чтобы получить вывод про первый интерфейс, можно поменять вывод модуля debug таким образом:
- debug: var=result.response[0]
Для того, чтобы сохранить вывод, можно использовать тот же прием, который использовался для модуля ios_facts.
Пример playbook 2_ntc_ansible_save.yml с сохранением результатов команды:
--- - name: Run show commands on routers hosts: cisco-routers gather_facts: false connection: local tasks: - name: Run sh ip int br ntc_show_command: connection: ssh platform: "cisco_ios" command: "sh ip int br" host: "{{ inventory_hostname }}" username: "cisco" password: "cisco" template_dir: "library/ntc-ansible/ntc-templates/templates" register: result - name: Copy facts to files copy: content: "{{ result.response | to_nice_json }}" dest: "all_facts/{{inventory_hostname}}_sh_ip_int_br.json"
Результат выполнения:
$ ansible-playbook 2_ntc-ansible_save.yml
В результате, в каталоге all_facts появляются соответствующие файлы для каждого маршрутизатора. Пример файла all_facts/192.168.100.1_sh_ip_int_br.json:
[ { "intf": "Ethernet0/0", "ipaddr": "192.168.100.1", "proto": "up", "status": "up" }, { "intf": "Ethernet0/1", "ipaddr": "192.168.200.1", "proto": "up", "status": "up" }, { "intf": "Ethernet0/2", "ipaddr": "unassigned", "proto": "down", "status": "administratively down" }, { "intf": "Ethernet0/3", "ipaddr": "unassigned", "proto": "up", "status": "up" }, { "intf": "Loopback0", "ipaddr": "10.1.1.1", "proto": "up", "status": "up" } ]
Для Cisco IOS в ntc-ansible есть такие шаблоны:
cisco_ios_dir.template cisco_ios_show_access-list.template cisco_ios_show_aliases.template cisco_ios_show_archive.template cisco_ios_show_capability_feature_routing.template cisco_ios_show_cdp_neighbors_detail.template cisco_ios_show_cdp_neighbors.template cisco_ios_show_clock.template cisco_ios_show_interfaces_status.template cisco_ios_show_interfaces.template cisco_ios_show_interface_transceiver.template cisco_ios_show_inventory.template cisco_ios_show_ip_arp.template cisco_ios_show_ip_bgp_summary.template cisco_ios_show_ip_bgp.template cisco_ios_show_ip_int_brief.template cisco_ios_show_ip_ospf_neighbor.template cisco_ios_show_ip_route.template cisco_ios_show_lldp_neighbors.template cisco_ios_show_mac-address-table.template cisco_ios_show_processes_cpu.template cisco_ios_show_snmp_community.template cisco_ios_show_spanning-tree.template cisco_ios_show_standby_brief.template cisco_ios_show_version.template cisco_ios_show_vlan.template cisco_ios_show_vtp_status.template
Список всех шаблонов можно посмотреть локально, если ntc-ansible установлен:
ls -ls library/ntc-ansible/ntc-templates/templates/
Или в .
Используя TextFSM, можно самостоятельно создавать дополнительные шаблоны.
И для того, чтобы ntc-ansible их использовал автоматически, добавить их в файл index (library/ntc-ansible/ntc-templates/templates/index):
# First line is the header fields for columns and is mandatory. # Regular expressions are supported in all fields except the first. # Last field supports variable length command completion. # abc[[xyz]] is expanded to abc(x(y(z)?)?)?, regexp inside [[]] is not supported # Template, Hostname, Platform, Command cisco_asa_dir.template, .*, cisco_asa, dir cisco_ios_show_archive.template, .*, cisco_ios, sh[[ow]] arc[[hive]] cisco_ios_show_capability_feature_routing.template, .*, cisco_ios, sh[[ow]] cap[[ability]] f[[eature]] r[[outing]] cisco_ios_show_aliases.template, .*, cisco_ios, sh[[ow]] alia[[ses]] ...
Синтаксис шаблонов и файла index описаны в разделе .