Установка Salt на Ubuntu 18.04
Для работы нам потребуется по меньшей мере две машины - master (сервер) и minion (клиент).
Как для мастера, так и для клиента требуется добавить официальный репозиторий:
wget -O - https://repo.saltstack.com/apt/ubuntu/18.04/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -
echo "deb [arch=amd64] http://repo.saltstack.com/apt/ubuntu/18.04/amd64/latest bionic main" | sudo tee /etc/apt/sources.list.d/saltstack.list
sudo apt-get update
Итак, установим мастер:
sudo apt-get install salt-master
Так как мастер будет слушать на двух портах, я настоятельно рекомендую сразу же закрыть его фаерволлом от всех машин кроме клиента.
Для этого можно использовать пакет iptables-persistent, ставим его:
sudo apt-get install -y iptables-persistent
Открываем файл конфигурации
sudo vim /etc/iptables/rules.v4
Создаем конфигурацию (xx замените на адрес клиента, если их неколько, добавьте несколько записей):
# Generated by iptables-save v1.6.1 on Sat Jun 22 13:34:44 2019
*filter
:INPUT ACCEPT [278:38814]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [231:33098]
# Allow access from clients
-A INPUT -s xx/32 -p tcp -m tcp --dport 4505 -j ACCEPT
-A INPUT -s xx/32 -p tcp -m tcp --dport 4506 -j ACCEPT
# And from localhost
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 4505 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 4506 -j ACCEPT
# Block all traffic to external hosts to Salt Master
-A INPUT -p tcp -m tcp --dport 4505 -j DROP
-A INPUT -p udp -m udp --dport 4505 -j DROP
-A INPUT -p tcp -m tcp --dport 4506 -j DROP
-A INPUT -p udp -m udp --dport 4506 -j DROP
COMMIT
# Completed on Sat Jun 22 13:34:44 2019
После этого применяем изменения и убеждаемся: что правила добавлены в фаерволл iptables:
sudo systemctl restart netfilter-persistent
Теперь установим клиента:
sudo apt-get install salt-minion
После этого, нам нужно указать адрес мастер сервера в его конфигурации:
sudo vim /etc/salt/minion
И задаем адрес мастера в следующем параметре:
master: xx.aa.zz.bb
Кроме этого, нам потребуется ключ мастер, который нужно получить на мастер сервере следующим образом:
salt-key -F master
And copy string from "master.pub" from Local Key section and insert into /etc/salt/minion in following place:
master_finger: "xx.aa.xx.ggg"
Этот ключ позволит клиенту убедиться, что мастер именно тот, который нам требуется.
После этого применяем конфигурацию:
sudo systemctl restart salt-minion.service
После этого клиент (minion) запросит авторизацию у мастер сервера, илем на мастер сервер и запрашиваем список активных запрсов на авторизацию:
sudo salt-key -L
В ответ вы увидите что-то вида:
Accepted Keys:
Denied Keys:
Unaccepted Keys:
client_hostname
Rejected Keys:
Одобряем запрос авторизации:
sudo salt-key --accept=client_hostname
Все, после этого с мастер сервера вы можете посылать любые командый конфигурации:
salt '*' test.version
Но это лишь половина дела, наша задача заключается в автоматическом конфигурировании сервисов на клиенте и это также очень просто!
Создаем основную конфигурацию:
sudo vim /srv/salt/top.sls
Где указываем следующее:
base:
'client_hostname':
- php_fpm_setup
Этот файл представляет собой точку входу для конфигурации Salt и здесь можно управлять тем, какие конфигурации должны быть применены на какого клиента.
Итак, создадим саму конфигурацию:
sudo vim /srv/salt/php_fpm_setup.sls
Вот такого вида:
nginx_pkg:
pkg.installed:
- name: nginx
nginx_service:
service.running:
- name: nginx
- enable: True
- require:
- pkg: nginx_pkg
fpm_pkg:
pkg.installed:
- name: php7.2-fpm
fpm_service:
service.running:
- name: php7.2-fpm
- enable: True
- require:
- pkg: fpm_pkg
Данный state файл установит на сервер пакеты nginx и php-fpm и настроит их автозапуск.
После этого, данный state можно применить как со стороны клиента:
salt-call state.apply
Так и удаленно, со стороны сервера:
salt '*' state.apply
Выдача в обоих случаях будет аналогичная:
---------
ID: nginx_pkg
Function: pkg.installed
Name: nginx
Result: True
Comment: All specified packages are already installed
Started: 15:44:59.405480
Duration: 57.533 ms
Changes:
----------
ID: nginx_service
Function: service.running
Name: nginx
Result: True
Comment: The service nginx is already running
Started: 15:44:59.463924
Duration: 54.275 ms
Changes:
----------
ID: fpm_pkg
Function: pkg.installed
Name: php7.2-fpm
Result: True
Comment: All specified packages are already installed
Started: 15:44:59.518411
Duration: 18.16 ms
Changes:
Все! Таким образом, у вас все конфигурации всех серверов будут находится в одном месте, сразу же рекомендую сделать /srv/salt git репозиторием.