Примеры Ansible для сети
В этом документе описаны примеры использования Ansible для управления вашей сетевой инфраструктурой.
- Предварительные условия
-
Пример 1: сбор фактов и создание резервных файлов с помощью плейбука
-
Пример 2: упрощение плейбуков с помощью платформенно-независимых модулей
- Устранение неполадок
Предварительные условия
Для этого примера требуются следующие компоненты:
- Ansible 2.10 (или выше) установлен. Дополнительную информацию см. в Руководстве по установке Ansible.
- Один или несколько сетевых устройств, совместимых с Ansible.
- Базовые знания YAML Синтаксис YAML.
- Базовые знания шаблонов Jinja2. Дополнительную информацию см. в Шаблонизация (Jinja2).
- Базовые навыки работы с командной строкой Linux.
- Базовые знания конфигурации сетевых коммутаторов и маршрутизаторов.
Группы и переменные в файле инвентаризации
Файл inventory — это конфигурационный файл в формате YAML или INI, который определяет сопоставление хостов с группами.
В нашем примере файл инвентаризации определяет группы eos, ios, vyos и «группу групп» switches. Более подробную информацию о подгруппах и файлах инвентаризации см. в Документации по группам инвентаризации Ansible.
Поскольку Ansible — гибкий инструмент, существует множество способов указать информацию о подключении и учетные данные. Мы рекомендуем использовать возможность [my_group:vars] в файле инвентаризации.
[all:vars] # these defaults can be overridden for any group in the [group:vars] section ansible_connection=ansible.netcommon.network_cli ansible_user=ansible [switches:children] eos ios vyos [eos] veos01 ansible_host=veos-01.example.net veos02 ansible_host=veos-02.example.net veos03 ansible_host=veos-03.example.net veos04 ansible_host=veos-04.example.net [eos:vars] ansible_become=yes ansible_become_method=enable ansible_network_os=arista.eos.eos ansible_user=my_eos_user ansible_password=my_eos_password [ios] ios01 ansible_host=ios-01.example.net ios02 ansible_host=ios-02.example.net ios03 ansible_host=ios-03.example.net [ios:vars] ansible_become=yes ansible_become_method=enable ansible_network_os=cisco.ios.ios ansible_user=my_ios_user ansible_password=my_ios_password [vyos] vyos01 ansible_host=vyos-01.example.net vyos02 ansible_host=vyos-02.example.net vyos03 ansible_host=vyos-03.example.net [vyos:vars] ansible_network_os=vyos.vyos.vyos ansible_user=my_vyos_user ansible_password=my_vyos_password
Если вы используете ssh-agent, вам не нужны строки ansible_password. Если вы используете ssh-ключи, но не ssh-agent, и у вас несколько ключей, укажите используемый ключ для каждого подключения в разделе [group:vars] с ansible_ssh_private_key_file=/path/to/correct/key. Дополнительную информацию об опциях ansible_ssh_ см. в Подключение к хостам: поведенческие параметры инвентаризации.
Предупреждение
Никогда не храните пароли в открытом виде.
Ansible vault для шифрования паролей
Функция «Vault» в Ansible позволяет хранить конфиденциальные данные, такие как пароли или ключи, в зашифрованных файлах вместо обычного текста в ваших плейбуках или ролях. Эти файлы Vault можно распространять или размещать в системе контроля версий. Дополнительную информацию см. в Использование зашифрованных переменных и файлов.
Вот как это будет выглядеть, если вы указали ваши SSH-пароли (зашифрованные с помощью Ansible Vault) среди своих переменных:
ansible_connection: ansible.netcommon.network_cli
ansible_network_os: vyos.vyos.vyos
ansible_user: my_vyos_user
ansible_ssh_pass: !vault |
$ANSIBLE_VAULT;1.1;AES256
39336231636137663964343966653162353431333566633762393034646462353062633264303765
6331643066663534383564343537343334633031656538370a333737656236393835383863306466
62633364653238323333633337313163616566383836643030336631333431623631396364663533
3665626431626532630a353564323566316162613432373738333064366130303637616239396438
9853
Общие переменные инвентаризации
Следующие переменные являются общими для всех платформ в инвентаризации, хотя их можно переопределить для конкретной группы инвентаризации или хоста.
- ansible_connection:
-
Ansible использует параметр ansible-connection для определения способа подключения к удалённому устройству. При работе с Ansible Networking установите это значение на соответствующий сетевой параметр подключения, например, ``ansible.netcommon.network_cli``, чтобы Ansible рассматривал удалённый узел как сетевое устройство с ограниченной средой выполнения. Без этого параметра Ansible попытается подключиться через ssh к удалённому узлу и выполнить Python-скрипт на сетевом устройстве, что потерпит неудачу, поскольку Python обычно недоступен на сетевых устройствах.
- ansible_network_os:
-
Указывает Ansible, к какой сетевой платформе относятся эти хосты. Это необходимо при использовании параметров подключения
ansible.netcommon.*. - ansible_user:
-
Пользователь, от имени которого нужно подключиться к удалённому устройству (коммутатору). Если не указано, используется пользователь, выполняющий
ansible-playbook. Указывает, от имени какого пользователя на сетевом устройстве происходит подключение. - ansible_password:
-
Соответствующий пароль для
ansible_userдля входа. Если не указано, используется SSH-ключ. - ansible_become:
-
Если необходимо использовать режим повышения привилегий (режим с привилегиями), см. следующий раздел.
- ansible_become_method:
-
Какой тип
becomeдолжен быть использован. Дляnetwork_cliединственный допустимый выбор —enable.
Эскалация привилегий
Некоторые сетевые платформы, такие как Arista EOS и Cisco IOS, имеют понятие разных режимов привилегий. Некоторые сетевые модули, например, те, которые изменяют состояние системы, включая пользователей, будут работать только в режимах повышенных привилегий. Ansible поддерживает become при использовании connection: ansible.netcommon.network_cli. Это позволяет повысить привилегии для задач, которые этого требуют. Добавление become: yes и become_method: enable сообщает Ansible перейти в режим повышенных привилегий перед выполнением задачи, как показано здесь:
[eos:vars] ansible_connection=ansible.netcommon.network_cli ansible_network_os=arista.eos.eos ansible_become=yes ansible_become_method=enable
Дополнительную информацию см. в руководстве использования become с сетевыми модулями.
Прокси-хосты
Если у Ansible-контроллера нет прямого маршрута к удалённому устройству и вам нужен прокси-хост, обратитесь к руководству Ansible Network Proxy Command для получения подробной информации о способах достижения этого.
Пример 1: сбор фактов и создание резервных файлов с помощью книги задач
Модули фактов Ansible собирают информацию о системе («факты»), которая доступна остальным задачам книги задач.
Ansible Networking поставляется с рядом модулей фактов, специфичных для сети. В этом примере мы используем модули _facts arista.eos.eos_facts, cisco.ios.ios_facts и vyos.vyos.vyos_facts для подключения к удалённому сетевому устройству. Поскольку учётные данные не передаются явно в качестве аргументов модуля, Ansible использует имя пользователя и пароль из файла инвентаризации.
Модули «Факты сети» Ansible собирают информацию из системы и сохраняют результаты в фактах с префиксом ansible_net_. Данные, собранные этими модулями, документированы в разделе Return Values документации модуля, в данном случае arista.eos.eos_facts и vyos.vyos.vyos_facts. Факты, такие как ansible_net_version, можно использовать позднее в задаче «Отображение некоторых фактов».
Для обеспечения вызова правильного режима (*_facts) задача выполняется условно на основе группы, определённой в файле инвентаризации. Дополнительную информацию об использовании условных выражений в книгах задач Ansible см. в Основные условные выражения с when.
В этом примере мы создадим файл инвентаризации, содержащий некоторые сетевые коммутаторы, затем запустим книгу задач для подключения к сетевым устройствам и получения некоторой информации о них.
Шаг 1: Создание инвентаризации
Сначала создайте файл с именем inventory, содержащий:
[switches:children] eos ios vyos [eos] eos01.example.net [ios] ios01.example.net [vyos] vyos01.example.net
Шаг 2: Создание книги задач
Далее, создайте файл книги задач с именем facts-demo.yml с содержанием:
- name: "Demonstrate connecting to switches"
hosts: switches
gather_facts: no
tasks:
###
# Collect data
#
- name: Gather facts (eos)
arista.eos.eos_facts:
when: ansible_network_os == 'arista.eos.eos'
- name: Gather facts (ios)
cisco.ios.ios_facts:
when: ansible_network_os == 'cisco.ios.ios'
- name: Gather facts (vyos)
vyos.vyos.vyos_facts:
when: ansible_network_os == 'vyos.vyos.vyos'
###
# Demonstrate variables
#
- name: Display some facts
debug:
msg: "The hostname is {{ ansible_net_hostname }} and the OS is {{ ansible_net_version }}"
- name: Facts from a specific host
debug:
var: hostvars['vyos01.example.net']
- name: Write facts to disk using a template
copy:
content: |
#jinja2: lstrip_blocks: True
EOS device info:
{% for host in groups['eos'] %}
Hostname: {{ hostvars[host].ansible_net_hostname }}
Version: {{ hostvars[host].ansible_net_version }}
Model: {{ hostvars[host].ansible_net_model }}
Serial: {{ hostvars[host].ansible_net_serialnum }}
{% endfor %}
IOS device info:
{% for host in groups['ios'] %}
Hostname: {{ hostvars[host].ansible_net_hostname }}
Version: {{ hostvars[host].ansible_net_version }}
Model: {{ hostvars[host].ansible_net_model }}
Serial: {{ hostvars[host].ansible_net_serialnum }}
{% endfor %}
VyOS device info:
{% for host in groups['vyos'] %}
Hostname: {{ hostvars[host].ansible_net_hostname }}
Version: {{ hostvars[host].ansible_net_version }}
Model: {{ hostvars[host].ansible_net_model }}
Serial: {{ hostvars[host].ansible_net_serialnum }}
{% endfor %}
dest: /tmp/switch-facts
run_once: yes
###
# Get running configuration
#
- name: Backup switch (eos)
arista.eos.eos_config:
backup: yes
register: backup_eos_location
when: ansible_network_os == 'arista.eos.eos'
- name: backup switch (vyos)
vyos.vyos.vyos_config:
backup: yes
register: backup_vyos_location
when: ansible_network_os == 'vyos.vyos.vyos'
- name: Create backup dir
file:
path: "/tmp/backups/{{ inventory_hostname }}"
state: directory
recurse: yes
- name: Copy backup files into /tmp/backups/ (eos)
copy:
src: "{{ backup_eos_location.backup_path }}"
dest: "/tmp/backups/{{ inventory_hostname }}/{{ inventory_hostname }}.bck"
when: ansible_network_os == 'arista.eos.eos'
- name: Copy backup files into /tmp/backups/ (vyos)
copy:
src: "{{ backup_vyos_location.backup_path }}"
dest: "/tmp/backups/{{ inventory_hostname }}/{{ inventory_hostname }}.bck"
when: ansible_network_os == 'vyos.vyos.vyos'
Шаг 3: Запуск книги задач
Для запуска книги задач выполните следующую команду в командной строке:
ansible-playbook -i inventory facts-demo.yml
В результате должно быть выведено подобное сообщение:
PLAY RECAP eos01.example.net : ok=7 changed=2 unreachable=0 failed=0 ios01.example.net : ok=7 changed=2 unreachable=0 failed=0 vyos01.example.net : ok=6 changed=2 unreachable=0 failed=0
Шаг 4: Проверка результатов книги задач
Затем, просмотрите содержимое файла, созданного с фактами коммутатора:
cat /tmp/switch-facts
Вы также можете посмотреть резервные файлы:
find /tmp/backups
Если ansible-playbook завершается ошибкой, следуйте инструкциям по отладке в Руководство по отладке и устранению неполадок в сети.
Пример 2: упрощение книг задач с помощью платформенно-независимых модулей
(Этот пример первоначально появился в блоге Deep Dive on cli_command for Network Automation, написанном Шэном Каванагом - @IPvSean).
Если в вашей среде присутствует две или более сетевых платформы, вы можете использовать платформенно-независимые модули для упрощения книг задач. Вы можете использовать такие платформенно-независимые модули, как ansible.netcommon.cli_command или ansible.netcommon.cli_config, вместо платформоспецифичных модулей, таких как arista.eos.eos_config, cisco.ios.ios_config, и junipernetworks.junos.junos_config. Это уменьшает количество задач и условных выражений, необходимых в ваших книгах задач.
Примечание
Платформенно-независимые модули требуют плагин подключения ansible.netcommon.network_cli.
Пример книги задач с платформоспецифичными модулями
Этот пример предполагает три платформы: Arista EOS, Cisco NXOS и Juniper JunOS. Без платформенно-независимых модулей пример книги задач может содержать следующие три задачи с командами, специфичными для платформы:
---
- name: Run Arista command
arista.eos.eos_command:
commands: show ip int br
when: ansible_network_os == 'arista.eos.eos'
- name: Run Cisco NXOS command
cisco.nxos.nxos_command:
commands: show ip int br
when: ansible_network_os == 'cisco.nxos.nxos'
- name: Run Vyos command
vyos.vyos.vyos_command:
commands: show interface
when: ansible_network_os == 'vyos.vyos.vyos'
Упрощённая книга задач с платформенно-независимым модулем cli_command
Вы можете заменить эти платформоспецифичные модули платформенно-независимым модулем ansible.netcommon.cli_command следующим образом:
---
- hosts: network
gather_facts: false
connection: ansible.netcommon.network_cli
tasks:
- name: Run cli_command on Arista and display results
block:
- name: Run cli_command on Arista
ansible.netcommon.cli_command:
command: show ip int br
register: result
- name: Display result to terminal window
debug:
var: result.stdout_lines
when: ansible_network_os == 'arista.eos.eos'
- name: Run cli_command on Cisco IOS and display results
block:
- name: Run cli_command on Cisco IOS
ansible.netcommon.cli_command:
command: show ip int br
register: result
- name: Display result to terminal window
debug:
var: result.stdout_lines
when: ansible_network_os == 'cisco.ios.ios'
- name: Run cli_command on Vyos and display results
block:
- name: Run cli_command on Vyos
ansible.netcommon.cli_command:
command: show interfaces
register: result
- name: Display result to terminal window
debug:
var: result.stdout_lines
when: ansible_network_os == 'vyos.vyos.vyos'
Если вы используете группы и переменные групп по типу платформы, эту книгу задач можно ещё более упростить:
---
- name: Run command and print to terminal window
hosts: routers
gather_facts: false
tasks:
- name: Run show command
ansible.netcommon.cli_command:
command: "{{show_interfaces}}"
register: command_output
Полный пример с использованием переменных групп и также пример резервного копирования конфигурации вы найдете по адресу Примеры платформенно-независимых книг задач.
Использование нескольких запросов с ansible.netcommon.cli_command
ansible.netcommon.cli_command также поддерживает несколько запросов.
---
- name: Change password to default
ansible.netcommon.cli_command:
command: "{{ item }}"
prompt:
- "New password"
- "Retype new password"
answer:
- "mypassword123"
- "mypassword123"
check_all: True
loop:
- "configure"
- "rollback"
- "set system root-authentication plain-text-password"
- "commit"
См. ansible.netcommon.cli_command для полной документации по этой команде.
Примечания по реализации
Демо переменные
Хотя эти задачи не нужны для записи данных на диск, они используются в этом примере для демонстрации некоторых методов доступа к фактам об указанных устройствах или узлах с именем.
Ansible hostvars позволяет получить доступ к переменным из узла с именем. Без этого мы бы возвращали данные для текущего узла, а не для узла с именем.
Дополнительную информацию см. в Информация об Ansible: магические переменные.
Получение текущей конфигурации
Модули arista.eos.eos_config и vyos.vyos.vyos_config имеют параметр backup:, который, если он установлен, заставит модуль создать полную резервную копию текущей running-config с удалённого устройства перед внесением любых изменений. Файл резервной копии записывается в папку backup в корневом каталоге книги задач. Если каталога не существует, он создаётся.
Чтобы продемонстрировать, как мы можем перенести резервный файл в другое место, мы регистрируем результат и перемещаем файл в путь, указанный в backup_path.
Обратите внимание, что при использовании переменных из задач таким образом мы используем двойные кавычки (") и двойные фигурные скобки ({{...}}) для указания Ansible, что это переменная.
Устранение неполадок
Если у вас возникла ошибка подключения, проверьте файл инвентаризации и книгу задач на наличие опечаток или пропущенных строк. Если проблема сохраняется, следуйте инструкциям по отладке в Руководство по отладке и устранению неполадок в сети.
© 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/network_best_practices_2.5.html