SaltStack — система управления конфигурациями и удаленного выполнения операций. Для коммуникации Salt может использовать SSH или собственный протокол, работающий на базе ZeroMQ.

Для работы используются 2 TCP порта 4505 и 4506.
Для работы Salt не нужен SSH
Отличия и сходства с Ansible:
- Ansible и Salt написаны на Python
- Ansible работает только через SSH, Salt может работать через SSH или собственный протокол
- В классической модели работы Salt использует на каждом хосте агенты
- Асинхронная связь сервера с клиентами (из-за этого параметра Salt работает быстрее чем Ansible)
Ключевые понятия и элементы:
- Salt master — процесс, который управляет агентами (миньонами)
- Salt minion — процесс, работающий на управляемых машинах.
- Salt state (SLS) — конфигурационные файлы, написанные на YAML (аналог Playbook в Ansible)
- Formulas — множества вызовов к модулям состояний (state modules), организованных таким образом, чтобы достичь определённого результата; они описывают как должна выглядеть система в том случае, когда формула применена. Формулы это заранее приготовленные состояния (salt states).
- Templates ( шаблоны)
- Pillars — защищённые хранилища важной информации, собственно salt state’ов.
- Grains — факты о системах (ОС, ip-адреса, модель процессора и т.д.)
- Mine – хранилище результатов исполнения команд на миньонах на мастер-сервере. С помощью Mine нельзя откатиться обратно.
Источник — http://xgu.ru/wiki/SaltStack
Установка и настройка
В документации можно посмотреть, как правильно установить Salt Master и Salt Minion.
Для удобства на моём GitHub можно забрать готовый стенд с одним мастером и двумя миньонами. Настроены базово.
Примеры работы команд:
- Проверка работы Salt на хостах:
salt '*' cmd.run "uname -a"
- Запуск команды «uname -a» на хосте:
salt minion1 cmd.run "uname -a"
- Просмотр информации о хосте minion1:
salt minion1 grains.items
- Пробный запуск (без внесения изменений) файла (/srv/salt/nginx/init.sls) состояния:
sudo salt minion1 state.apply nginx test=True
- Если проблем не обнаружено, то можно запустить state:
sudo salt minion1 state.apply nginx
Пример установки nginx на хосте с помощью Salt:
Далее все действия выполняются от root
Создадим каталог nginx /srv/salt/nginx
mkdir -p /srv/salt/nginx
Далее создадим файл /srv/salt/nginx/init.sls со следующим содержимым:
vim /srv/salt/nginx/init.sls
#Установка nginx
nginx:
pkg:
- installed
#Запуск службы
service:
- running
#Отслеживание изменений, при которых будет перезапуск службы
- watch:
- pkg: nginx
- file: /etc/nginx/nginx.conf
#Отправка файла /etc/nginx/nginx.conf на удаленный хост
/etc/nginx/nginx.conf:
file:
- managed
- source: salt://nginx/nginx.conf #путь к файлу на мастер-хосте
- user: root
- group: root
- mode: 644
Создадим файл конфигурации nginx.conf который будет отправлен на удаленный хост:
vim /srv/salt/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 512;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Далее создадим файл top.sls который будет запускать файл init.sls из каталога nginx:
vim /srv/salt/top.sls
base:
'minion1': #'*' - установка на всех хостах
- nginx
Проверим как отработает тестовый запуск:
root@master:/srv/salt# salt '*' state.highstate test=True
minion2:
----------
ID: states
Function: no.None
Result: False
Comment: No Top file or master_tops data matches found. Please see master log for details.
Changes:
Summary for minion2
------------
Succeeded: 0
Failed: 1
------------
Total states run: 1
Total run time: 0.000 ms
minion1:
----------
ID: nginx
Function: pkg.installed
Result: None
Comment: The following packages would be installed/updated: nginx
Started: 15:18:32.250134
Duration: 164.761 ms
Changes:
----------
installed:
----------
nginx:
----------
new:
installed
old:
----------
ID: /etc/nginx/nginx.conf
Function: file.managed
Result: None
Comment: The file /etc/nginx/nginx.conf is set to be changed
Note: No changes made, actual changes may
be different due to other states.
Started: 15:18:32.428594
Duration: 36.336 ms
Changes:
----------
newfile:
/etc/nginx/nginx.conf
----------
ID: nginx
Function: service.running
Result: None
Comment: Service is set to be started
Started: 15:18:32.491839
Duration: 15.134 ms
Changes:
Summary for minion1
------------
Succeeded: 3 (unchanged=3, changed=2)
Failed: 0
------------
Total states run: 3
Total run time: 216.231 ms
ERROR: Minions returned with non-zero exit code
root@master:/srv/salt#
Сначала мы увидим ошибку, в ошибке будет написано, что по хосту minion2 не найдено изменений. Так и должно быть, по хосту minion1 проблем не найдено, можем запустить state:
salt '*' state.highstate
После установки, можно проверить, был ли установлен nginx, указав в адресной строке адрес сервер minion1:

Если у нас получается зайти на веб-интерфейс, значит установка прошла успешно.