Модуль ios_facts#
Модуль ios_facts собирает информацию с устройств под управлением IOS.
Информация берется из таких команд:
dir
show version
show memory statistics
show interfaces
show ipv6 interface
show lldp
show lldp neighbors detail
show running-config
Примечание
Чтобы видеть, какие команды Ansible выполняет на оборудовании, можно настроить EEM applet, который будет генерировать лог сообщения о выполненных командах.
В модуле можно указывать, какие параметры собирать - можно собирать всю информацию, а можно только подмножество. По умолчанию модуль собирает всю информацию, кроме конфигурационного файла.
Какую информацию собирать, указывается в параметре gather_subset. Поддерживаются такие варианты (указаны также команды, которые будут выполняться на устройстве):
all
hardware
dir
show version
show memory statistics
config
show version
show running-config
interfaces
dir
show version
show interfaces
show ip interface
show ipv6 interface
show lldp
show lldp neighbors detail
Собрать все факты:
- ios_facts:
gather_subset: all
Собрать только подмножество interfaces:
- ios_facts:
gather_subset:
- interfaces
Собрать всё, кроме hardware:
- ios_facts:
gather_subset:
- "!hardware"
Ansible собирает такие факты:
ansible_net_all_ipv4_addresses - список IPv4 адресов на устройстве
ansible_net_all_ipv6_addresses - список IPv6 адресов на устройстве
ansible_net_config - конфигурация (для Cisco sh run)
ansible_net_filesystems - файловая система устройства
ansible_net_gather_subset - какая информация собирается (hardware, default, interfaces, config)
ansible_net_hostname - имя устройства
ansible_net_image - имя и путь ОС
ansible_net_interfaces - словарь со всеми интерфейсами устройства. Имена интерфейсов - ключи, а данные - параметры каждого интерфейса
ansible_net_memfree_mb - сколько свободной памяти на устройстве
ansible_net_memtotal_mb - сколько памяти на устройстве
ansible_net_model - модель устройства
ansible_net_serialnum - серийный номер
ansible_net_version - версия IOS
Использование модуля#
Пример playbook 1_ios_facts.yml с использованием модуля ios_facts (собираются все факты):
---
- name: Collect IOS facts
hosts: cisco-routers
tasks:
- name: Facts
ios_facts:
gather_subset: all
$ ansible-playbook 1_ios_facts.yml
Для того, чтобы посмотреть, какие именно факты собираются с устройства, можно добавить флаг -v (информация сокращена):
$ ansible-playbook 1_ios_facts.yml -v
Using /home/nata/pyneng_course/chapter15/ansible.cfg as config file
После того, как Ansible собрал факты с устройства, все факты доступны как переменные в playbook, шаблонах и т.д.
Например, можно отобразить содержимое факта с помощью debug (playbook 2_ios_facts_debug.yml):
---
- name: Collect IOS facts
hosts: 192.168.100.1
tasks:
- name: Facts
ios_facts:
gather_subset: all
- name: Show ansible_net_all_ipv4_addresses fact
debug: var=ansible_net_all_ipv4_addresses
- name: Show ansible_net_interfaces fact
debug: var=ansible_net_interfaces['Ethernet0/0']
Результат выполнения playbook:
$ ansible-playbook 2_ios_facts_debug.yml
Сохранение фактов#
В том виде, в котором информация отображается в режиме verbose, довольно сложно понять какая информация собирается об устройствах. Для того, чтобы лучше понять, какая информация собирается об устройствах и в каком формате, скопируем полученную информацию в файл.
Для этого будет использоваться модуль copy.
Playbook 3_ios_facts.yml собирает всю информацию об устройствах и записывает в разные файлы (создайте каталог all_facts перед запуском playbook или раскомментируйте задачу Create all_facts dir, и Ansible создаст каталог сам):
---
- name: Collect IOS facts
hosts: cisco-routers
tasks:
- name: Facts
ios_facts:
gather_subset: all
register: ios_facts_result
#- name: Create all_facts dir
# file:
# path: ./all_facts/
# state: directory
# mode: 0755
- name: Copy facts to files
copy:
content: "{{ ios_facts_result | to_nice_json }}"
dest: "all_facts/{{inventory_hostname}}_facts.json"
Модуль copy позволяет копировать файлы с управляющего хоста (на котором
установлен Ansible) на удаленный хост. Но так как в этом случае, указан
параметр connection: local
, файлы будут скопированы на локальный
хост.
Чаще всего, модуль copy используется таким образом:
- copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
Но в данном случае нет исходного файла, содержимое которого нужно скопировать. Вместо этого, есть содержимое переменной ios_facts_result, которое нужно перенести в файл all_facts/{{inventory_hostname}}_facts.json.
Для того, чтобы перенести содержимое переменной в файл, в модуле copy вместо src используется параметр content.
В строке content: "{{ ios_facts_result | to_nice_json }}"
параметр to_nice_json - это фильтр Jinja2, который преобразует информацию переменной в формат, в котором удобней читать информацию
переменная в формате Jinja2 должна быть заключена в двойные фигурные скобки, а также указана в двойных кавычках
Так как в пути dest используются имена устройств, будут сгенерированы уникальные файлы для каждого устройства.
Результат выполнения playbook:
$ ansible-playbook 3_ios_facts.yml
После этого в каталоге all_facts находятся такие файлы:
192.168.100.1_facts.json
192.168.100.2_facts.json
192.168.100.3_facts.json
Содержимое файла all_facts/192.168.100.1_facts.json:
{
"ansible_facts": {
"ansible_net_all_ipv4_addresses": [
"192.168.200.1",
"192.168.100.1",
"10.1.1.1"
],
"ansible_net_all_ipv6_addresses": [],
"ansible_net_config": "Building configuration...\n\nCurrent configuration :
...
Сохранение информации об устройствах не только поможет разобраться, какая информация собирается, но и может быть полезным для дальнейшего использования информации. Например, можно использовать факты об устройстве в шаблоне.
При повторном выполнении playbook Ansible не будет изменять информацию в файлах, если факты об устройстве не изменились
Если информация изменилась, для соответствующего устройства будет выставлен статус changed. Таким образом, по выполнению playbook всегда понятно, когда какая-то информация изменилась.
Повторный запуск playbook (без изменений):
$ ansible-playbook 3_ios_facts.yml