September 15, 2020

Установка 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 репозиторием.