Примеры Ansible для работы с сетью
В этом документе описаны примеры использования Ansible для управления вашей сетевой инфраструктурой.
- Предварительные условия
- Группы и переменные в файле инвентаризации
- Пример 1: сбор фактов и создание резервных файлов с помощью плейбука
- Пример 2: упрощение плейбуков с помощью модулей, не зависящих от сети
- Примечания по реализации
- Отладка
Предварительные условия
Для этого примера необходимо следующее:
- Ansible 2.5 (или выше) установлен. См. Руководство по установке для получения дополнительной информации.
- Один или несколько сетевых устройств, совместимых с Ansible.
- Базовые знания YAML Синтаксиса YAML.
- Базовые знания шаблонов Jinja2. См. Шаблонизация (Jinja2) для получения дополнительной информации.
- Базовые навыки работы с командной строкой Linux.
- Базовые знания конфигурации сетевых коммутаторов и маршрутизаторов.
Группы и переменные в файле инвентаризации
Файл инвентаризации — это файл конфигурации, похожий на YAML или INI, который определяет сопоставление хостов с группами.
В нашем примере файл инвентаризации определяет группы eos, ios, vyos и «группу групп» под названием switches. Дополнительные сведения о подгруппах и файлах инвентаризации см. в документации Ansible по группам инвентаризации.
Поскольку Ansible — гибкий инструмент, есть несколько способов указать информацию о подключении и учетные данные. Рекомендуется использовать возможность [my_group:vars] в файле инвентаризации. Вот как это будет выглядеть, если вы указали свои пароли SSH (зашифрованные с помощью Ansible Vault) среди переменных:
[all:vars]
# these defaults can be overridden for any group in the [group:vars] section
ansible_connection=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=eos
ansible_user=my_eos_user
ansible_password= !vault |
$ANSIBLE_VAULT;1.1;AES256
37373735393636643261383066383235363664386633386432343236663533343730353361653735
6131363539383931353931653533356337353539373165320a316465383138636532343463633236
37623064393838353962386262643230303438323065356133373930646331623731656163623333
3431353332343530650a373038366364316135383063356531633066343434623631303166626532
9562
[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=ios
ansible_user=my_ios_user
ansible_password= !vault |
$ANSIBLE_VAULT;1.1;AES256
34623431313336343132373235313066376238386138316466636437653938623965383732373130
3466363834613161386538393463663861636437653866620a373136356366623765373530633735
34323262363835346637346261653137626539343534643962376139366330626135393365353739
3431373064656165320a333834613461613338626161633733343566666630366133623265303563
8472
[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
ansible_user=my_vyos_user
ansible_password= !vault |
$ANSIBLE_VAULT;1.1;AES256
39336231636137663964343966653162353431333566633762393034646462353062633264303765
6331643066663534383564343537343334633031656538370a333737656236393835383863306466
62633364653238323333633337313163616566383836643030336631333431623631396364663533
3665626431626532630a353564323566316162613432373738333064366130303637616239396438
9853
Если вы используете 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 можно затем распространять или размещать в системе контроля версий. Дополнительную информацию см. в Использование Vault в плейбуках.
Общие переменные инвентаризации
Следующие переменные являются общими для всех платформ в инвентаризации, хотя их можно переопределить для определённой группы инвентаризации или хоста.
| ansible_connection: | |
|---|---|
Ansible использует параметр ansible-connection, чтобы определить, как подключиться к удалённому устройству. При работе с сетевыми Ansible установите его в значение network_cli, чтобы Ansible обрабатывал удалённый узел как сетевое устройство с ограниченной средой выполнения. Без этого параметра Ansible попытается подключиться с помощью ssh к удалённому узлу и выполнить скрипт Python на сетевом устройстве, что не сработает, так как Python обычно не доступен на сетевых устройствах. | |
| ansible_network_os: | |
Указывает Ansible, к какой сетевой платформе относятся эти хосты. Это требуется при использовании network_cli или netconf. | |
| 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: network_cli. Это позволяет повышать привилегии для задач, которые требуют этого. Добавление become: yes и become_method: enable сообщает Ansible о переходе в режим повышенных привилегий перед выполнением задачи, как показано здесь:
[eos:vars] ansible_connection=network_cli ansible_network_os=eos ansible_become=yes ansible_become_method=enable
Дополнительную информацию см. в руководстве использование become с сетевыми модулями.
Хосты-прокси
Если у контроллера Ansible нет прямого маршрута к удалённому устройству и вам необходимо использовать хост-прокси, см. руководство Ansible Network Proxy Command для получения подробной информации о том, как это сделать.
Пример 1: сбор фактов и создание резервных файлов с помощью плейбука
Модули фактов Ansible собирают информацию о системе «факты», которая доступна для остальной части вашего плейбука.
Ansible Networking поставляется с рядом модулей фактов, специфичных для сети. В этом примере мы используем модули _facts eos_facts, ios_facts и vyos_facts для подключения к удалённому сетевому устройству. Поскольку учетные данные не передаются явно через аргументы модуля, Ansible использует имя пользователя и пароль из файла инвентаризации.
«Сеть модулей фактов Ansible» собирает информацию из системы и сохраняет результаты в фактах с префиксом ansible_net_. Данные, собранные этими модулями, описаны в разделе Return Values документации по модулям, в этом случае eos_facts и 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)
eos_facts:
when: ansible_network_os == 'eos'
- name: Gather facts (ops)
ios_facts:
when: ansible_network_os == 'ios'
- name: Gather facts (vyos)
vyos_facts:
when: ansible_network_os == '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)
eos_config:
backup: yes
register: backup_eos_location
when: ansible_network_os == 'eos'
- name: backup switch (vyos)
vyos_config:
backup: yes
register: backup_vyos_location
when: ansible_network_os == '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 == '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'
Шаг 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).
Если в вашей среде есть две или более сетевых платформ, вы можете использовать модули, не зависящие от сети, для упрощения своих книг задач. Вы можете использовать модули, не зависящие от сети, такие как cli_command или cli_config, вместо платформоспецифических модулей, таких как eos_config, ios_config, и junos_config. Это сокращает количество задач и условных операторов, необходимых в ваших книгах задач.
Примечание
Модули, не зависящие от сети, требуют плагин подключения network_cli.
Пример книги задач с платформоспецифическими модулями
В этом примере предполагается три платформы: Arista EOS, Cisco NXOS и Juniper JunOS. Без модулей, не зависящих от сети, пример книги задач может содержать следующие три задачи с платформоспецифическими командами:
---
- name: Run Arista command
eos_command:
commands: show ip int br
when: ansible_network_os == 'eos'
- name: Run Cisco NXOS command
nxos_command:
commands: show ip int br
when: ansible_network_os == 'nxos'
- name: Run Vyos command
vyos_command:
commands: show interface
when: ansible_network_os == 'vyos'
Упрощенная книга задач с модулем cli_command - не зависящим от сети
Вы можете заменить эти платформоспецифические модули модулем cli_command - не зависящим от сети, следующим образом:
---
- hosts: network
gather_facts: false
connection: network_cli
tasks:
- name: Run cli_command on Arista and display results
block:
- name: Run cli_command on Arista
cli_command:
command: show ip int br
register: result
- name: Display result to terminal window
debug:
var: result.stdout_lines
when: ansible_network_os == 'eos'
- name: Run cli_command on Cisco IOS and display results
block:
- name: Run cli_command on Cisco IOS
cli_command:
command: show ip int br
register: result
- name: Display result to terminal window
debug:
var: result.stdout_lines
when: ansible_network_os == 'ios'
- name: Run cli_command on Vyos and display results
block:
- name: Run cli_command on Vyos
cli_command:
command: show interfaces
register: result
- name: Display result to terminal window
debug:
var: result.stdout_lines
when: ansible_network_os == 'vyos'
Если вы используете группы и переменные групп по типу платформы, эту книгу задач можно ещё упростить до:
---
- name: Run command and print to terminal window
hosts: routers
gather_facts: false
tasks:
- name: Run show command
cli_command:
command: "{{show_interfaces}}"
register: command_output
Полный пример использования group_vars и пример резервного копирования конфигурации можно найти на странице Примеры сетевых модулей, не зависящих от платформы.
Использование нескольких запросов с cli_command
cli_command также поддерживает несколько запросов.
---
- name: Change password to default
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"
Полную документацию по этой команде см. в cli_command.
Примечания по реализации
Демонстрационные переменные
Хотя эти задачи не нужны для записи данных на диск, они используются в этом примере для демонстрации некоторых способов доступа к фактам о заданных устройствах или узле с именем.
Ansible hostvars позволяет вам получить доступ к переменным из узла с именем. Без этого мы вернём данные для текущего узла, а не узла с именем.
Дополнительную информацию см. в Получение информации об остальных узлах с помощью магических переменных.
Получение текущей конфигурации
Модули eos_config и vyos_config имеют опцию backup:, которая, при установке, заставит модуль создать полную резервную копию текущей running-config с удалённого устройства перед внесением каких-либо изменений. Файл резервной копии записывается в папку backup в корневой директории книги задач. Если папки нет, она создаётся.
Чтобы продемонстрировать, как мы можем переместить файл резервной копии в другое место, мы регистрируем результат и перемещаем файл в путь, хранящийся в backup_path.
Обратите внимание, что при использовании переменных из задач таким образом мы используем двойные кавычки (") и двойные фигурные скобки ({{...}}), чтобы указать Ansible, что это переменная.
Устранение неполадок
Если вы получаете ошибку соединения, проверьте инвентарь и книгу задач на наличие опечаток или отсутствующих строк. Если проблема сохраняется, выполните действия по отладке в Руководстве по отладке и устранению неполадок сети.
См. также
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.8/network/user_guide/network_best_practices_2.5.html