Salt-Minion для автоматизации

Salt-Minion обеспечивает интеграцию VyOS с SaltStack для централизованного управления конфигурацией и автоматизации сетевых устройств.

Обзор

Что такое SaltStack

SaltStack - система управления конфигурацией и оркестрации:

  • Автоматизация IT-инфраструктуры
  • Удаленное выполнение команд
  • Управление конфигурациями
  • Infrastructure as Code подход
  • Event-driven архитектура
  • Python-based решение

Архитектура Salt

Salt Master:

  • Центральный сервер управления
  • Хранит states и pillars
  • Управляет minions
  • Выполняет оркестрацию

Salt Minion:

  • Агент на управляемом устройстве
  • Выполняет команды от Master
  • Отправляет данные и events
  • Применяет конфигурации

Salt Proxy Minion:

  • Для устройств без возможности запуска агента
  • Использует SSH/NETCONF/API
  • Поддержка network devices
  • Netmiko для VyOS

Возможности для VyOS

  • Operational commands - выполнение show команд
  • Configuration management - применение конфигураций
  • Batch operations - массовые изменения
  • Event monitoring - отслеживание событий
  • Inventory management - учет оборудования
  • Compliance checking - проверка соответствия

Установка Salt Master

Установка на сервере управления

Ubuntu/Debian:

# Add SaltStack repository
curl -fsSL https://packages.broadcom.com/artifactory/api/gpg/key/public | sudo tee /etc/apt/keyrings/salt-archive-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/salt-archive-keyring.gpg arch=amd64] https://packages.broadcom.com/artifactory/saltproject-deb/ stable main" | sudo tee /etc/apt/sources.list.d/salt.list

# Install Salt Master
sudo apt update
sudo apt install salt-master salt-minion salt-ssh

# Start service
sudo systemctl enable salt-master
sudo systemctl start salt-master

CentOS/RHEL:

# Add repository
sudo yum install https://repo.saltproject.io/salt/py3/redhat/8/x86_64/latest/salt-repo-latest.el8.noarch.rpm

# Install
sudo yum install salt-master salt-minion

# Start
sudo systemctl enable salt-master
sudo systemctl start salt-master

Базовая конфигурация Master

/etc/salt/master:

interface: 0.0.0.0
auto_accept: False
file_roots:
  base:
    - /srv/salt/states
pillar_roots:
  base:
    - /srv/salt/pillars

Создание структуры директорий:

sudo mkdir -p /srv/salt/{states,pillars}
sudo systemctl restart salt-master

Конфигурация Salt-Minion на VyOS

Базовая настройка

Минимальная конфигурация:

set service salt-minion id 'vyos-router-01'
set service salt-minion master '192.0.2.250'
commit
save

Параметры:

  • id - уникальный идентификатор minion
  • master - IP или hostname Salt Master

Расширенная конфигурация

set service salt-minion id 'vyos-edge-router'
set service salt-minion master '192.0.2.250'
set service salt-minion hash md5
set service salt-minion interval 60
commit
save

Параметры:

  • hash - алгоритм хеширования (md5, sha256)
  • interval - интервал проверки Master (секунды)

Множественные Masters

set service salt-minion id 'vyos-router-01'
set service salt-minion master '192.0.2.250'
set service salt-minion master '192.0.2.251'
commit
save

Принятие ключей на Master

Просмотр ожидающих ключей

На Salt Master:

sudo salt-key -L

Вывод:

Accepted Keys:
Denied Keys:
Unaccepted Keys:
vyos-router-01
Rejected Keys:

Принятие ключа

Принять конкретный ключ:

sudo salt-key -a vyos-router-01

Принять все ключи (осторожно!):

sudo salt-key -A

Удаление ключа

sudo salt-key -d vyos-router-01

Проверка соединения

sudo salt 'vyos-router-01' test.ping

Вывод:

vyos-router-01:
    True

Salt Proxy Minion для VyOS

Что такое Proxy Minion

Proxy Minion используется когда:

  • Невозможно установить агент на устройство
  • Требуется управление через SSH/API
  • Network devices без Salt support

Настройка Netmiko Proxy

Установка Netmiko на Salt Master:

sudo pip3 install netmiko

Создание Pillar для устройства:

/srv/salt/pillars/vyos-proxy.sls:

proxy:
  proxytype: netmiko
  device_type: vyos
  host: 192.0.2.10
  username: vyos
  password: vyos_password
  secret: enable_password

Top file для Pillars:

/srv/salt/pillars/top.sls:

base:
  'vyos-proxy-01':
    - vyos-proxy

Запуск Proxy Minion

sudo salt-proxy --proxyid=vyos-proxy-01 -d

Или через systemd:

/etc/systemd/system/salt-proxy@.service:

[Unit]
Description=Salt Proxy Minion %i
After=network.target

[Service]
Type=notify
NotifyAccess=all
ExecStart=/usr/bin/salt-proxy --proxyid=%i
Restart=always

[Install]
WantedBy=multi-user.target

Запуск:

sudo systemctl enable salt-proxy@vyos-proxy-01
sudo systemctl start salt-proxy@vyos-proxy-01

Принятие ключа Proxy Minion

sudo salt-key -a vyos-proxy-01

Базовые операции

Проверка соединения

Все minions:

sudo salt '*' test.ping

Конкретный minion:

sudo salt 'vyos-router-01' test.ping

По glob pattern:

sudo salt 'vyos-*' test.ping

Получение информации

Версия системы:

sudo salt 'vyos-router-01' test.version

Сетевые интерфейсы:

sudo salt 'vyos-router-01' network.interfaces

Информация об интерфейсе:

sudo salt 'vyos-router-01' network.interface eth0

Выполнение команд

Shell команды:

sudo salt 'vyos-router-01' cmd.run 'show version'

Множественные команды:

sudo salt 'vyos-router-01' cmd.run 'show interfaces; show system uptime'

Управление конфигурацией VyOS

Через Proxy Minion с Netmiko

Отправка конфигурационной команды:

sudo salt 'vyos-proxy-01' netmiko.send_config config_commands="['set interfaces ethernet eth0 description WAN_Link']" commit=True

Множественные команды:

sudo salt 'vyos-proxy-01' netmiko.send_config \
  config_commands="['set system host-name vyos-edge', 'set system domain-name example.com']" \
  commit=True

States для конфигурации

Создание State file:

/srv/salt/states/vyos-basic.sls:

configure_hostname:
  netmiko.send_config:
    - config_commands:
        - set system host-name vyos-router-01
        - set system domain-name corp.local
    - commit: True

configure_ntp:
  netmiko.send_config:
    - config_commands:
        - set system ntp server 0.pool.ntp.org
        - set system ntp server 1.pool.ntp.org
    - commit: True

configure_dns:
  netmiko.send_config:
    - config_commands:
        - set system name-server 8.8.8.8
        - set system name-server 8.8.4.4
    - commit: True

Применение State:

sudo salt 'vyos-proxy-01' state.apply vyos-basic

Batch конфигурация

Файл с командами:

/srv/salt/states/commands.txt:

set interfaces ethernet eth1 description LAN
set interfaces ethernet eth1 address 192.168.1.1/24
set service ssh port 22
set service ssh listen-address 0.0.0.0

State для применения:

/srv/salt/states/vyos-config.sls:

apply_config_from_file:
  netmiko.send_config:
    - config_file: salt://commands.txt
    - commit: True

Применение:

sudo salt 'vyos-proxy-01' state.apply vyos-config

Примеры автоматизации

Пример 1: Базовая настройка системы

/srv/salt/states/vyos-system.sls:

system_hostname:
  netmiko.send_config:
    - config_commands:
        - set system host-name {{ pillar['hostname'] }}
    - commit: True

system_timezone:
  netmiko.send_config:
    - config_commands:
        - set system time-zone {{ pillar['timezone'] }}
    - commit: True

system_users:
  netmiko.send_config:
    - config_commands:
        - set system login user admin authentication plaintext-password {{ pillar['admin_password'] }}
        - set system login user admin level admin
    - commit: True

/srv/salt/pillars/vyos-router-01.sls:

hostname: vyos-edge-01
timezone: Europe/Moscow
admin_password: SecurePassword123!

Пример 2: Настройка интерфейсов

/srv/salt/states/vyos-interfaces.sls:

{% for iface, config in pillar['interfaces'].items() %}
configure_{{ iface }}:
  netmiko.send_config:
    - config_commands:
        - set interfaces ethernet {{ iface }} description '{{ config.description }}'
        {% if config.address %}
        - set interfaces ethernet {{ iface }} address {{ config.address }}
        {% endif %}
        {% if config.dhcp %}
        - set interfaces ethernet {{ iface }} address dhcp
        {% endif %}
    - commit: True
{% endfor %}

/srv/salt/pillars/vyos-router-01.sls:

interfaces:
  eth0:
    description: "WAN Interface"
    dhcp: true
  eth1:
    description: "LAN Interface"
    address: "192.168.1.1/24"
  eth2:
    description: "DMZ Interface"
    address: "192.168.100.1/24"

Пример 3: Настройка Firewall

/srv/salt/states/vyos-firewall.sls:

firewall_wan_local:
  netmiko.send_config:
    - config_commands:
        - set firewall ipv4 name WAN_LOCAL default-action drop
        - set firewall ipv4 name WAN_LOCAL rule 10 action accept
        - set firewall ipv4 name WAN_LOCAL rule 10 state established
        - set firewall ipv4 name WAN_LOCAL rule 10 state related
        - set firewall ipv4 name WAN_LOCAL rule 20 action drop
        - set firewall ipv4 name WAN_LOCAL rule 20 state invalid
        - set firewall ipv4 name WAN_LOCAL rule 30 action accept
        - set firewall ipv4 name WAN_LOCAL rule 30 protocol icmp
        - set interfaces ethernet eth0 firewall in name WAN_LOCAL
    - commit: True

Пример 4: Развертывание NAT

/srv/salt/states/vyos-nat.sls:

configure_nat:
  netmiko.send_config:
    - config_commands:
        - set nat source rule 100 outbound-interface name eth0
        - set nat source rule 100 source address 192.168.1.0/24
        - set nat source rule 100 translation address masquerade
    - commit: True

Пример 5: DHCP Server

/srv/salt/states/vyos-dhcp.sls:

configure_dhcp_server:
  netmiko.send_config:
    - config_commands:
        - set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option default-router 192.168.1.1
        - set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option name-server 192.168.1.1
        - set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 range 0 start 192.168.1.100
        - set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 range 0 stop 192.168.1.200
        - set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 subnet-id 1
    - commit: True

Получение информации из VyOS

Operational команды

Через proxy minion:

# Show version
sudo salt 'vyos-proxy-01' netmiko.send_command command="show version"

# Show configuration
sudo salt 'vyos-proxy-01' netmiko.send_command command="show configuration"

# Show interfaces
sudo salt 'vyos-proxy-01' netmiko.send_command command="show interfaces"

# Show route table
sudo salt 'vyos-proxy-01' netmiko.send_command command="show ip route"

Grains (система фактов)

Получение всех grains:

sudo salt 'vyos-router-01' grains.items

Конкретный grain:

sudo salt 'vyos-router-01' grains.get os

Мониторинг и Events

Event Bus

Подписка на события:

sudo salt-run state.event pretty=True

Reactor System

Автоматические действия на события:

/etc/salt/master.d/reactor.conf:

reactor:
  - 'salt/minion/*/start':
    - /srv/salt/reactors/minion-start.sls

/srv/salt/reactors/minion-start.sls:

send_notification:
  local.cmd.run:
    - tgt: salt-master
    - arg:
      - echo "Minion {{ data['id'] }} started" | mail -s "Minion Start" admin@example.com

Операционные команды

На VyOS

Проверка статуса salt-minion:

show service salt-minion

Перезапуск salt-minion:

restart salt-minion

На Salt Master

Список всех ключей:

sudo salt-key -L

Список minions:

sudo salt '*' test.ping

Применение state:

sudo salt 'vyos-router-01' state.apply

Highstate (все states):

sudo salt 'vyos-router-01' state.highstate

Устранение неполадок

Minion не подключается

Проблема: Minion не появляется в списке ключей.

Диагностика:

На VyOS:

show service salt-minion
show log | grep salt

На Master:

sudo systemctl status salt-master
sudo tail -f /var/log/salt/master

Решение:

# Проверить доступность Master
ping 192.0.2.250

# Проверить порты (4505, 4506)
telnet 192.0.2.250 4505
telnet 192.0.2.250 4506

# Firewall на Master
sudo firewall-cmd --add-port=4505-4506/tcp --permanent
sudo firewall-cmd --reload

Ключ не принимается

Проблема: salt-key не показывает minion.

Решение:

Перезапустить minion на VyOS:

restart salt-minion

На Master:

# Удалить старый ключ
sudo salt-key -d vyos-router-01

# Подождать новый
sudo salt-key -L

Команды не выполняются

Проблема: salt 'minion' test.ping не возвращает результат.

Диагностика:

# Проверить ключ принят
sudo salt-key -L

# Verbose mode
sudo salt 'vyos-router-01' test.ping -l debug

Решение:

# Перезапустить master
sudo systemctl restart salt-master

# Перезапустить minion
restart salt-minion  # на VyOS

Proxy Minion проблемы

Проблема: Proxy minion не подключается к VyOS.

Диагностика:

# Проверить логи
sudo journalctl -u salt-proxy@vyos-proxy-01 -f

# Тест SSH
ssh vyos@192.0.2.10

Решение:

# Проверить pillar
sudo salt 'vyos-proxy-01' pillar.items

# Проверить credentials в pillar
# Убедиться netmiko установлен
sudo pip3 install --upgrade netmiko

Netmiko ошибки

Проблема: “Authentication failed” или “Connection timeout”.

Решение:

Проверить Pillar:

sudo salt 'vyos-proxy-01' pillar.get proxy

Обновить credentials:

# /srv/salt/pillars/vyos-proxy.sls
proxy:
  proxytype: netmiko
  device_type: vyos
  host: 192.0.2.10
  username: correct_user
  password: correct_password

Refresh pillar:

sudo salt 'vyos-proxy-01' saltutil.refresh_pillar

Безопасность

Рекомендации по безопасности

  1. Защита Master:
# /etc/salt/master
auto_accept: False
client_acl:
  admin:
    - .*
publisher_acl:
  admin:
    - .*
  1. Firewall на Master:
# Только с известных сетей
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.0.2.0/24" port protocol="tcp" port="4505-4506" accept' --permanent
sudo firewall-cmd --reload
  1. Шифрование Pillars:
# Генерация ключа
sudo salt-key --gen-keys=master

# /etc/salt/master
pillar_opts: False
gpg_keydir: /etc/salt/gpgkeys
  1. Ротация ключей:
# Удалить старый ключ
sudo salt-key -d vyos-router-01

# Minion сгенерирует новый при перезапуске
restart salt-minion
  1. Аудит действий:
# /etc/salt/master
return_job: True
job_cache: True
keep_jobs: 24
  1. Ограничение команд:
# /etc/salt/master
publisher_acl:
  operator:
    - test.ping
    - network.interface
  admin:
    - .*

Лучшие практики

  1. Используйте Pillars для секретов:

    • Храните пароли в pillars
    • Шифруйте sensitive данные
    • Ограничивайте доступ к pillars
  2. Version control для States:

    • Храните states в Git
    • Code review изменений
    • Тестируйте перед применением
  3. Тестирование перед production:

# Test mode
sudo salt 'vyos-router-01' state.apply test=True

# Single minion first
sudo salt 'vyos-router-01' state.apply vyos-config

# Then batch
sudo salt 'vyos-*' state.apply vyos-config
  1. Backup перед изменениями:
# Save config перед применением state
sudo salt 'vyos-proxy-01' netmiko.send_command command="save /config/backup-$(date +%Y%m%d).config"
  1. Мониторинг результатов:
# Check job results
sudo salt-run jobs.list_jobs

# Specific job
sudo salt-run jobs.lookup_jid <job_id>
  1. Документирование:

    • Описывайте states
    • Комментируйте pillars
    • Ведите changelog
  2. Организация файлов:

/srv/salt/
├── states/
│   ├── base/
│   │   ├── init.sls
│   │   └── packages.sls
│   ├── network/
│   │   ├── vyos-interfaces.sls
│   │   ├── vyos-firewall.sls
│   │   └── vyos-nat.sls
│   └── services/
│       ├── vyos-dhcp.sls
│       └── vyos-dns.sls
└── pillars/
    ├── top.sls
    ├── network/
    │   └── vyos-devices.sls
    └── secrets/
        └── credentials.sls
  1. Регулярные обновления:
    • Обновляйте Salt Master
    • Обновляйте Minions
    • Следите за security bulletins

Интеграция с другими системами

Gitlab CI/CD

.gitlab-ci.yml:

stages:
  - test
  - deploy

test_state:
  stage: test
  script:
    - salt 'vyos-test' state.apply vyos-config test=True

deploy_production:
  stage: deploy
  script:
    - salt 'vyos-prod-*' state.apply vyos-config
  only:
    - main
  when: manual

Ansible + Salt

Использование Salt как execution engine для Ansible:

# playbook.yml
- hosts: localhost
  tasks:
    - name: Apply Salt state to VyOS
      command: salt 'vyos-*' state.apply vyos-config

Prometheus Monitoring

Salt для сбора метрик:

# Custom grain для метрик
sudo salt 'vyos-*' grains.set monitoring:enabled True

Заключение

Salt-Minion предоставляет мощные возможности для автоматизации VyOS:

  • Centralized management - единая точка управления
  • Configuration as Code - версионирование конфигураций
  • Scalability - управление множеством устройств
  • Flexibility - поддержка direct minion и proxy minion
  • Event-driven - автоматизация на основе событий
  • Integration - интеграция с CI/CD pipeline

Основные сценарии использования:

  • Массовое развертывание конфигураций
  • Стандартизация настроек
  • Автоматизация routine задач
  • Compliance checking
  • Централизованное управление network infrastructure

Правильная настройка Salt обеспечивает эффективное управление VyOS роутерами в масштабе enterprise и упрощает operations в cloud окружениях.