Автоматизация сети: Ansible, Python, Netmiko
Сетевая автоматизация — это уже не "хотим", а "надо". Ручное изменение конфигурации на 100 коммутаторах — это ошибки, потеря времени и неконсистентность. Ansible, Python с Netmiko и другие инструменты превращают рутину в одно нажатие кнопки. В этом гайде я покажу реальные примеры автоматизации для Cisco, MikroTik и других вендоров.
Почему автоматизация?
- Скорость — изменить VLAN на 1000 портах за 10 секунд вместо 3 часов
- Надёжность — исключается человеческий фактор (опечатки, забытые команды)
- Документация — конфигурация всех устройств хранится в Git
- Audit и compliance — легко проверить, что все устройства соответствуют стандарту
- Быстрое восстановление — после сбоя вся конфигурация разворачивается за минуты
Ansible — агентless автоматизация для сетей
Ansible не требует установки агентов на сетевое оборудование. Он подключается по SSH (или API) и отправляет команды. Основные компоненты:
- Inventory — список устройств с переменными
- Playbook — YAML-файл с задачами
- Module — готовое действие (ios_config, vyos_command, eos_config)
Установка Ansible и коллекций для сетей
# Установка на Linux (Ubuntu) apt update && apt install ansible -y # Установка коллекций для Cisco, Arista, Juniper, MikroTik ansible-galaxy collection install cisco.ios ansible-galaxy collection install community.routeros
Пример inventory для сети
# inventory.yml
all:
children:
cisco_switches:
hosts:
sw1:
ansible_host: 192.168.1.10
ansible_network_os: cisco.ios.ios
sw2:
ansible_host: 192.168.1.11
ansible_network_os: cisco.ios.ios
mikrotik_routers:
hosts:
gw1:
ansible_host: 192.168.1.1
ansible_network_os: community.routeros.routeros
vars:
ansible_user: admin
ansible_password: "{{ vault_admin_password }}"
ansible_connection: ansible.netcommon.network_cli
Playbook: добавить VLAN на все коммутаторы
# add_vlan.yml
---
- name: Configure VLANs on Cisco switches
hosts: cisco_switches
gather_facts: no
tasks:
- name: Create VLAN 100
cisco.ios.ios_vlan:
vlan_id: 100
name: Automation_VLAN
state: present
- name: Assign VLAN to access ports 1-10
cisco.ios.ios_l2_interfaces:
config:
- name: GigabitEthernet0/1
access:
vlan: 100
- name: GigabitEthernet0/2
access:
vlan: 100
state: merged
- name: Save configuration
cisco.ios.ios_config:
save_when: always
Запуск: ansible-playbook -i inventory.yml add_vlan.yml --ask-vault-pass
Playbook для MikroTik (RouterOS)
---
- name: Configure MikroTik
hosts: mikrotik_routers
tasks:
- name: Add firewall rule
community.routeros.api:
commands:
- /ip firewall filter add chain=input protocol=tcp dst-port=22 action=accept comment="Allow SSH"
- /ip firewall filter add chain=input action=drop comment="Drop all else"
Python + Netmiko — для сложной логики
Netmiko — библиотека, которая упрощает SSH-подключение к сетевым устройствам (Cisco, Arista, Juniper, HP, MikroTik, Huawei и 30+ вендоров).
Установка Netmiko
pip install netmiko
Скрипт для резервного копирования конфигураций всех устройств
from netmiko import ConnectHandler
from datetime import datetime
import yaml
# Загрузка устройств из YAML
with open('devices.yml', 'r') as f:
devices = yaml.safe_load(f)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
for device in devices:
try:
connection = ConnectHandler(**device)
hostname = connection.send_command("show run | include hostname").split()[-1]
# Получение конфигурации
config = connection.send_command("show running-config")
# Сохранение в файл
filename = f"backups/{hostname}_{timestamp}.cfg"
with open(filename, 'w') as f:
f.write(config)
print(f"✅ {hostname} - backup saved")
connection.disconnect()
except Exception as e:
print(f"❌ Ошибка: {device['host']} - {str(e)}")
Массовое изменение пароля на 50 коммутаторах
from netmiko import ConnectHandler
import getpass
new_password = getpass.getpass("Введите новый пароль: ")
devices = [
{"device_type": "cisco_ios", "host": "192.168.1.10", "username": "admin", "password": "oldpass"},
{"device_type": "cisco_ios", "host": "192.168.1.11", "username": "admin", "password": "oldpass"},
# ... ещё 48 устройств
]
for device in devices:
conn = ConnectHandler(**device)
conn.enable()
commands = [
"enable secret " + new_password,
"username admin secret " + new_password,
"write memory"
]
output = conn.send_config_set(commands)
print(f"Готово: {device['host']}")
conn.disconnect()
NAPALM — абстракция от вендора
NAPALM (Network Automation and Programmability Abstraction Layer with Multivendor support) позволяет писать код, который работает одинаково на Cisco, Juniper, Arista, Nokia.
from napalm import get_network_driver
driver = get_network_driver('ios')
device = driver(hostname='192.168.1.10', username='admin', password='pass')
device.open()
# Получение фактов
facts = device.get_facts()
print(f"Версия: {facts['os_version']}, Модель: {facts['model']}")
# Получение конфигурации
config = device.get_config()
print(config['running'])
# Загрузка новой конфигурации
device.load_merge_candidate(filename='new_config.cfg')
print(device.compare_config())
device.commit_config()
device.close()
Nornir — параллельное выполнение задач
Nornir — это фреймворк на Python, который работает как Ansible, но даёт полный контроль из кода. Поддерживает инвентарь в YAML и параллельное выполнение.
from nornir import InitNornir
from nornir_netmiko.tasks import netmiko_send_command
from nornir_utils.plugins.functions import print_result
nr = InitNornir(config_file="config.yml")
result = nr.run(
task=netmiko_send_command,
command_string="show version | include IOS"
)
print_result(result)
Лучшие практики автоматизации
- Используйте Git — все конфигурации, плейбуки, скрипты должны быть в репозитории. GitLab/GitHub Actions для CI/CD.
- Не храните пароли в открытом виде — используйте Ansible Vault, HashiCorp Vault, или переменные окружения.
- Тестируйте на лабораторном стенде — прежде чем запускать на production, проверьте на одном тестовом устройстве.
- Используйте dry-run режимы — Ansible имеет
--check, Netmiko можно запускать с--dry-run. - Версионируйте изменения — перед автоматическим изменением делайте backup, логируйте изменения.
Пример: полная автоматизация развертывания нового коммутатора
# new_switch_setup.py
from netmiko import ConnectHandler
# Шаг 1: Базовая настройка
switch = {
"device_type": "cisco_ios",
"host": "10.0.0.1",
"username": "cisco",
"password": "cisco"
}
conn = ConnectHandler(**switch)
# Шаг 2: Загрузка базовой конфигурации из шаблона
with open('switch_template.txt', 'r') as f:
config_lines = f.read()
output = conn.send_config_set(config_lines.split('\n'))
# Шаг 3: Обновление паролей
conn.send_command("enable secret StrongPass123")
conn.send_command("username admin secret StrongPass123")
# Шаг 4: Сохранение
conn.save_config()
# Шаг 5: Проверка
version = conn.send_command("show version | include IOS")
print(f"Коммутатор настроен: {version}")
conn.disconnect()
Заключение: Начните с малого — автоматизируйте резервное копирование конфигураций с помощью Netmiko. Затем переходите к Ansible для массовых изменений. Со временем вы построите CI/CD пайплайн, где любое изменение конфигурации проходит код-ревью и автоматический деплой. Сетевая автоматизация — это ваш путь от "настройщика" к "инженеру DevOps".