Автоматизация сети: Ansible, Python, Netmiko

Сетевая автоматизация — это уже не "хотим", а "надо". Ручное изменение конфигурации на 100 коммутаторах — это ошибки, потеря времени и неконсистентность. Ansible, Python с Netmiko и другие инструменты превращают рутину в одно нажатие кнопки. В этом гайде я покажу реальные примеры автоматизации для Cisco, MikroTik и других вендоров.

Автоматизация сети
v

Почему автоматизация?

Ansible — агентless автоматизация для сетей

Ansible не требует установки агентов на сетевое оборудование. Он подключается по SSH (или API) и отправляет команды. Основные компоненты:

Установка 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)

Лучшие практики автоматизации

Пример: полная автоматизация развертывания нового коммутатора

# 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".