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-masterCentOS/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- уникальный идентификатор minionmaster- 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:
TrueSalt 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_passwordTop 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=TrueStates для конфигурации
Создание 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-basicBatch конфигурация
Файл с командами:
/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.0State для применения:
/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=TrueReactor 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.applyHighstate (все 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 # на VyOSProxy 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 netmikoNetmiko ошибки
Проблема: “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_passwordRefresh pillar:
sudo salt 'vyos-proxy-01' saltutil.refresh_pillarБезопасность
Рекомендации по безопасности
- Защита Master:
# /etc/salt/master
auto_accept: False
client_acl:
admin:
- .*
publisher_acl:
admin:
- .*- 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- Шифрование Pillars:
# Генерация ключа
sudo salt-key --gen-keys=master
# /etc/salt/master
pillar_opts: False
gpg_keydir: /etc/salt/gpgkeys- Ротация ключей:
# Удалить старый ключ
sudo salt-key -d vyos-router-01
# Minion сгенерирует новый при перезапуске
restart salt-minion- Аудит действий:
# /etc/salt/master
return_job: True
job_cache: True
keep_jobs: 24- Ограничение команд:
# /etc/salt/master
publisher_acl:
operator:
- test.ping
- network.interface
admin:
- .*Лучшие практики
Используйте Pillars для секретов:
- Храните пароли в pillars
- Шифруйте sensitive данные
- Ограничивайте доступ к pillars
Version control для States:
- Храните states в Git
- Code review изменений
- Тестируйте перед применением
Тестирование перед 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- Backup перед изменениями:
# Save config перед применением state
sudo salt 'vyos-proxy-01' netmiko.send_command command="save /config/backup-$(date +%Y%m%d).config"- Мониторинг результатов:
# Check job results
sudo salt-run jobs.list_jobs
# Specific job
sudo salt-run jobs.lookup_jid <job_id>Документирование:
- Описывайте states
- Комментируйте pillars
- Ведите changelog
Организация файлов:
/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- Регулярные обновления:
- Обновляйте 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: manualAnsible + Salt
Использование Salt как execution engine для Ansible:
# playbook.yml
- hosts: localhost
tasks:
- name: Apply Salt state to VyOS
command: salt 'vyos-*' state.apply vyos-configPrometheus 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 окружениях.