Архитектура Salt проста: Master — центральный сервер управления, Minion — агент на каждом управляемом сервере. Коммуникация через ZeroMQ (порты 4505/4506), шифрование AES-256.
Мы выделили отдельный сервер для Salt Master (Ubuntu 22.04, 8 CPU, 16 GB RAM, SSD):
# Установка Salt 3006 LTS (Sulfur)
curl -o /tmp/bootstrap-salt.sh -L https://bootstrap.saltproject.io
sudo sh /tmp/bootstrap-salt.sh -M -x python3 stable 3006
# Проверяем версию
salt --version
# salt 3006.8 (Sulfur)
# Конфигурация Master
sudo vim /etc/salt/master
Конфигурация /etc/salt/master:
# /etc/salt/master
# Интерфейс — слушаем на внутреннем IP
interface: 10.0.0.1
# Worker threads — по 1 на каждые 50-100 minion
worker_threads: 8
# Таймауты
timeout: 30
# File server
file_roots:
base:
- /srv/salt
- /srv/salt/formulas
# Pillar data
pillar_roots:
base:
- /srv/pillar
# Auto-accept minions по определённому паттерну (для автоматизации)
# В продакшене лучше ручной accept
autosign_grains_dir: /etc/salt/autosign_grains
# Nodegroups для удобного targeting
nodegroups:
webservers: 'G@role:webserver'
databases: 'G@role:database'
ubuntu: 'G@os:Ubuntu'
debian: 'G@os:Debian'
centos: 'G@os:CentOS Stream'
dc1: 'G@datacenter:dc1'
dc2: 'G@datacenter:dc2'
# Reactor — автоматические реакции на события
reactor:
- 'salt/auth': # Новый minion подключается
- /srv/reactor/new_minion.sls
- 'salt/beacon/*/inotify/*': # Изменение файла
- /srv/reactor/file_changed.sls
- 'salt/beacon/*/diskusage/*': # Диск заполнен
- /srv/reactor/disk_alert.sls
# Включаем git fileserver для GitOps
fileserver_backend:
- roots
- gitfs
gitfs_remotes:
- https://git.nordhost.local/infra/salt-states.git:
- mountpoint: salt://git
# Логирование
log_level: warning
log_file: /var/log/salt/master
# Создаём структуру каталогов
sudo mkdir -p /srv/{salt,pillar,reactor}
sudo mkdir -p /srv/salt/{users,packages,services,monitoring,security}
sudo mkdir -p /srv/pillar/{users,servers}
sudo mkdir -p /etc/salt/autosign_grains
# Запускаем Salt Master
sudo systemctl enable salt-master
sudo systemctl start salt-master
# Открываем порты
sudo ufw allow from 10.0.0.0/16 to any port 4505 comment "Salt publish"
sudo ufw allow from 10.0.0.0/16 to any port 4506 comment "Salt return"
Проблема курицы и яйца: чтобы установить Salt Minion на 300 серверов, нужен инструмент автоматизации. Решение — salt-ssh, который работает без агента через SSH:
# Устанавливаем salt-ssh
sudo apt install -y salt-ssh
# Создаём roster — инвентарь серверов для SSH
# /etc/salt/roster
sudo bash -c 'cat > /etc/salt/roster << EOF
# Формат: minion_id : host, user, port, sudo
web-01:
host: 10.0.1.11
user: deploy
sudo: True
minion_opts:
grains:
role: webserver
datacenter: dc1
web-02:
host: 10.0.1.12
user: deploy
sudo: True
minion_opts:
grains:
role: webserver
datacenter: dc1
db-01:
host: 10.0.1.21
user: deploy
sudo: True
minion_opts:
grains:
role: database
datacenter: dc1
EOF'
# Для 300 серверов генерируем roster из CSV
#!/bin/bash
# generate_roster.sh
while IFS=, read -r hostname ip role dc; do
cat >> /etc/salt/roster << EOF
${hostname}:
host: ${ip}
user: deploy
sudo: True
minion_opts:
grains:
role: ${role}
datacenter: ${dc}
EOF
done < servers.csv
# Устанавливаем minion на все серверы через salt-ssh
salt-ssh '*' state.apply install_minion
# State для установки minion:
# /srv/salt/install_minion.sls
install-salt-minion:
cmd.run:
- name: |
curl -o /tmp/bootstrap-salt.sh -L https://bootstrap.saltproject.io
sh /tmp/bootstrap-salt.sh -x python3 stable 3006
- unless: salt-minion --version | grep 3006
configure-minion:
file.managed:
- name: /etc/salt/minion
- contents: |
master: 10.0.0.1
grains:
role: {{ grains['role'] }}
datacenter: {{ grains['datacenter'] }}
- require:
- cmd: install-salt-minion
start-minion:
service.running:
- name: salt-minion
- enable: True
- require:
- file: configure-minion
После установки minion на все серверы принимаем ключи на master:
# Смотрим ожидающие ключи
sudo salt-key -L
# Unaccepted Keys:
# web-01
# web-02
# ...(298 keys)
# Принимаем все
sudo salt-key -A -y
# Проверяем связь
salt '*' test.ping
# web-01: True
# web-02: True
# ...
# 300 minions responded