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

> Salt-Minion на VyOS - централизованное управление конфигурацией, автоматизация развертывания и удаленное выполнение команд

Source: https://opennix.org/docs/vyos/services/vyos-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:**
```bash
# 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:**
```bash
# 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`:
```yaml
interface: 0.0.0.0
auto_accept: False
file_roots:
  base:
    - /srv/salt/states
pillar_roots:
  base:
    - /srv/salt/pillars
```

Создание структуры директорий:
```bash
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:
```bash
sudo salt-key -L
```

Вывод:
```
Accepted Keys:
Denied Keys:
Unaccepted Keys:
vyos-router-01
Rejected Keys:
```

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

Принять конкретный ключ:
```bash
sudo salt-key -a vyos-router-01
```

Принять все ключи (осторожно!):
```bash
sudo salt-key -A
```

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

```bash
sudo salt-key -d vyos-router-01
```

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

```bash
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:**
```bash
sudo pip3 install netmiko
```

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

`/srv/salt/pillars/vyos-proxy.sls`:
```yaml
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`:
```yaml
base:
  'vyos-proxy-01':
    - vyos-proxy
```

### Запуск Proxy Minion

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

Или через systemd:

`/etc/systemd/system/salt-proxy@.service`:
```ini
[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
```

Запуск:
```bash
sudo systemctl enable salt-proxy@vyos-proxy-01
sudo systemctl start salt-proxy@vyos-proxy-01
```

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

```bash
sudo salt-key -a vyos-proxy-01
```

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

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

Все minions:
```bash
sudo salt '*' test.ping
```

Конкретный minion:
```bash
sudo salt 'vyos-router-01' test.ping
```

По glob pattern:
```bash
sudo salt 'vyos-*' test.ping
```

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

Версия системы:
```bash
sudo salt 'vyos-router-01' test.version
```

Сетевые интерфейсы:
```bash
sudo salt 'vyos-router-01' network.interfaces
```

Информация об интерфейсе:
```bash
sudo salt 'vyos-router-01' network.interface eth0
```

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

Shell команды:
```bash
sudo salt 'vyos-router-01' cmd.run 'show version'
```

Множественные команды:
```bash
sudo salt 'vyos-router-01' cmd.run 'show interfaces; show system uptime'
```

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

### Через Proxy Minion с Netmiko

**Отправка конфигурационной команды:**
```bash
sudo salt 'vyos-proxy-01' netmiko.send_config config_commands="['set interfaces ethernet eth0 description WAN_Link']" commit=True
```

**Множественные команды:**
```bash
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`:
```yaml
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:**
```bash
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`:
```yaml
apply_config_from_file:
  netmiko.send_config:
    - config_file: salt://commands.txt
    - commit: True
```

**Применение:**
```bash
sudo salt 'vyos-proxy-01' state.apply vyos-config
```

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

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

`/srv/salt/states/vyos-system.sls`:
```yaml
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`:
```yaml
hostname: vyos-edge-01
timezone: Europe/Moscow
admin_password: SecurePassword123!
```

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

`/srv/salt/states/vyos-interfaces.sls`:
```yaml
{% 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`:
```yaml
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`:
```yaml
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`:
```yaml
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`:
```yaml
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:
```bash
# 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:
```bash
sudo salt 'vyos-router-01' grains.items
```

Конкретный grain:
```bash
sudo salt 'vyos-router-01' grains.get os
```

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

### Event Bus

Подписка на события:
```bash
sudo salt-run state.event pretty=True
```

### Reactor System

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

`/etc/salt/master.d/reactor.conf`:
```yaml
reactor:
  - 'salt/minion/*/start':
    - /srv/salt/reactors/minion-start.sls
```

`/srv/salt/reactors/minion-start.sls`:
```yaml
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

Список всех ключей:
```bash
sudo salt-key -L
```

Список minions:
```bash
sudo salt '*' test.ping
```

Применение state:
```bash
sudo salt 'vyos-router-01' state.apply
```

Highstate (все states):
```bash
sudo salt 'vyos-router-01' state.highstate
```

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

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

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

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

На VyOS:
```
show service salt-minion
show log | grep salt
```

На Master:
```bash
sudo systemctl status salt-master
sudo tail -f /var/log/salt/master
```

**Решение:**
```bash
# Проверить доступность 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:
```bash
# Удалить старый ключ
sudo salt-key -d vyos-router-01

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

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

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

**Диагностика:**
```bash
# Проверить ключ принят
sudo salt-key -L

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

**Решение:**
```bash
# Перезапустить master
sudo systemctl restart salt-master

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

### Proxy Minion проблемы

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

**Диагностика:**
```bash
# Проверить логи
sudo journalctl -u salt-proxy@vyos-proxy-01 -f

# Тест SSH
ssh vyos@192.0.2.10
```

**Решение:**
```bash
# Проверить pillar
sudo salt 'vyos-proxy-01' pillar.items

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

### Netmiko ошибки

**Проблема**: "Authentication failed" или "Connection timeout".

**Решение:**

Проверить Pillar:
```bash
sudo salt 'vyos-proxy-01' pillar.get proxy
```

Обновить credentials:
```yaml
# /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:
```bash
sudo salt 'vyos-proxy-01' saltutil.refresh_pillar
```

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

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

1. **Защита Master**:
```yaml
# /etc/salt/master
auto_accept: False
client_acl:
  admin:
    - .*
publisher_acl:
  admin:
    - .*
```

2. **Firewall на Master**:
```bash
# Только с известных сетей
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
```

3. **Шифрование Pillars**:
```bash
# Генерация ключа
sudo salt-key --gen-keys=master

# /etc/salt/master
pillar_opts: False
gpg_keydir: /etc/salt/gpgkeys
```

4. **Ротация ключей**:
```bash
# Удалить старый ключ
sudo salt-key -d vyos-router-01

# Minion сгенерирует новый при перезапуске
restart salt-minion
```

5. **Аудит действий**:
```yaml
# /etc/salt/master
return_job: True
job_cache: True
keep_jobs: 24
```

6. **Ограничение команд**:
```yaml
# /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**:
```bash
# 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
```

4. **Backup перед изменениями**:
```bash
# Save config перед применением state
sudo salt 'vyos-proxy-01' netmiko.send_command command="save /config/backup-$(date +%Y%m%d).config"
```

5. **Мониторинг результатов**:
```bash
# Check job results
sudo salt-run jobs.list_jobs

# Specific job
sudo salt-run jobs.lookup_jid <job_id>
```

6. **Документирование**:
   - Описывайте states
   - Комментируйте pillars
   - Ведите changelog

7. **Организация файлов**:
```
/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
```

8. **Регулярные обновления**:
   - Обновляйте Salt Master
   - Обновляйте Minions
   - Следите за security bulletins

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

### Gitlab CI/CD

`.gitlab-ci.yml`:
```yaml
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:
```yaml
# playbook.yml
- hosts: localhost
  tasks:
    - name: Apply Salt state to VyOS
      command: salt 'vyos-*' state.apply vyos-config
```

### Prometheus Monitoring

Salt для сбора метрик:
```bash
# 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 окружениях.

