Автоматизация инфраструктуры с помощью Salt
Привет, Хабр!
Salt (также известный как SaltStack) — это открытое решение, которое позволяет управлять конфигурациями тысяч серверов и устройств. В основе Salt лежит архитектура »мастер-миньон», где мастер-сервер контролирует и управляет подчиненными миньонами.
Salt имеет большой набор инструментов для выполнения удаленных команд, управления состояниями систем, а также для оркестрации и автоматизации различных аспектов инфраструктуры.
Начнем с установки и настройки Salt, а затем перейдем к выполнению базовых команд и управлению конфигурациями с помощью Salt States.
Установка Salt
Salt Master — это сервер, который управляет всеми миньонами (minions). Вот как его установить:
Открываем терминал на сервере, который хочется использовать в качестве мастер-сервера.
Устанавливаем Salt Master с помощью пакетного менеджера ОС. Например, для Ubuntu есть команда:
sudo apt-get install salt-master
Настраиваем Salt Master. редактируем файл конфигурации, расположенный по адресу
/etc/salt/master
, под свои нужды.Запускаем службу Salt Master:
sudo systemctl start salt-master
Миньоны (minions) — это управляемые серверы. Установим:
Открываем терминал на каждом сервере, которым нужно управлять.
Устанавливаем Salt Minion:
sudo apt-get install salt-minion
Настраиваем миньон. редактируем файл конфигурации
/etc/salt/minion
, указав адрес мастера:master:
Запускаем службу Salt Minion:
sudo systemctl start salt-minion
После установки и настройки миньонов, их нужно подключить к мастеру:
Применяем ключи миньонов на мастер-сервере, чтобы разрешить подключение:
sudo salt-key -A
Мастер-сервер отобразит список ключей, ожидающих принятия. Подтверждаем принятие каждого ключа.
Можно чекнуть, что мастер-сервер может общаться с миньонами:
salt '*' test.ping
Каждый миньон должен вернуть True
, что указывает на успешное подключение.
Основы
Основная команда для выполнения задач на миньонах — это salt
. Она позволяет отправлять команды на один или несколько миньонов одновременно.
Например, эта команда выполняет команду hostname
на всех миньонах, подключенных к мастеру:
salt '*' cmd.run 'hostname'
Вывод команды будет содержать список миньонов и соответствующие результаты выполнения команды hostname
:
minion1:
my-minion-1
minion2:
my-minion-2
А эта команда устанавливает пакет nginx
на всех миньонах:
salt '*' pkg.install nginx
Вывод команды покажет, был ли установлен nginx
на каждом миньоне:
minion1:
----------
nginx:
----------
new:
1.18.0-0ubuntu1
old:
1.17.0-0ubuntu1
minion2:
----------
nginx:
----------
new:
1.18.0-0ubuntu1
old:
1.17.0-0ubuntu1
Команда salt-call
позволяет выполнять команды непосредственно на миньоне. Это полезно для отладки и проверки логов, т.к можно увидеть логи конкретного миньона, а не только результат выполнения команды с мастера.
Выполним ту же команду hostname
непосредственно на миньоне:
sudo salt-call cmd.run 'hostname'
Вывод будет аналогичен:
local:
my-minion-1
При использовании salt-call
можно видеть логи, которые обычно не отображаются при запуске команды с мастера. Например, выполним установку пакета nginx
и посмотрим лог:
sudo salt-call pkg.install nginx
Вывод будет включать подробные сообщения о процессе установки:
[INFO ] Executing command ['systemd-run', '--scope', 'apt-get', '-q', '-y', 'install', 'nginx'] in directory '/root'
[INFO ] Executing state pkg.installed for [nginx]
[INFO ] Executing command ['apt-get', '-q', 'update'] in directory '/root'
local:
----------
nginx:
----------
new:
1.18.0-0ubuntu1
old:
1.17.0-0ubuntu1
[INFO ] Completed state [nginx] at time 14:22:38.657927 duration_in_ms=25314.493
Salt позволяет нацеливаться на миньонов по различным критериям, таким как имя хоста, данные grains, IP-адреса и т.д. Например:
salt 'web*' cmd.run 'uptime'
Команда выполнит uptime
только на тех миньонах, чьи имена начинаются с «web».
Управление конфигурациями с помощью Salt States
Salt States определяют конфигурацию системы с помощью файлов состояний SLS. Эти файлики содержат декларации того, каким образом должна быть настроена система. Каждый файл состояния состоит из одного или более состояний, которые описывают желаемое состояние ресурсов.
Пример простого SLS файла, который устанавливает и запускает Nginx:
install_nginx:
pkg.installed:
- name: nginx
start_nginx:
service.running:
- name: nginx
- require:
- pkg: install_nginx
install_nginx
: это идентификатор состояния, который устанавливает пакет nginx.
pkg.installed
: это состояние, которое указывает, что пакет nginx должен быть установлен.
start_nginx
: это идентификатор состояния, который запускает сервис nginx.
service.running
: это состояние, которое указывает, что сервис nginx должен быть запущен.
require
: это зависимость, которая гарантирует, что пакет nginx будет установлен перед запуском сервиса nginx.
Теперь создадим и примененим SLS файлы.
Создаем:
Создаем каталог для файлов состояний:
sudo mkdir -p /srv/salt
Создаем новый SLS файл:
Например,nginx.sls
:sudo nano /srv/salt/nginx.sls
Добавляем конфигурацию в SLS файл:
Вставляем следующий код в файлnginx.sls
:install_nginx: pkg.installed: - name: nginx start_nginx: service.running: - name: nginx - enable: True - require: - pkg: install_nginx
Применяем файл:
Применяем состояние ко всем миньонам:
Исполнзуйте командуstate.apply
для применения состояния:salt '*' state.apply nginx
Проверьте результат выполнения:
После выполнения команды видим вывод, показывающий результаты применения состояния на каждом миньоне:minion1: ---------- install_nginx: ---------- __id__: install_nginx __run_num__: 0 __sls__: nginx changes: ---------- nginx: ---------- new: 1.18.0-0ubuntu1 old: 1.17.0-0ubuntu1 comment: All specified packages are already installed. duration: 0.123 ms name: nginx result: True start_nginx: ---------- __id__: start_nginx __run_num__: 1 __sls__: nginx changes: ---------- nginx: True comment: Service nginx is already enabled, and is in the correct state duration: 1.234 ms name: nginx result: True
Прочие примеры конфигурации и выполнения state.apply команд
Установка и запуск Apache
Создаем файл apache.sls
:
install_apache:
pkg.installed:
- name: apache2
start_apache:
service.running:
- name: apache2
- enable: True
- require:
- pkg: install_apache
Применем состояние:
salt '*' state.apply apache
Создание юзера
Создаем файл user.sls
:
create_user:
user.present:
- name: ivan
- home: /home/ivan
- shell: /bin/bash
Применяем состояние:
salt '*' state.apply user
Копирование файла
Создаем файл file.sls
:
copy_file:
file.managed:
- name: /etc/myconfig.conf
- source: salt://myconfig.conf
- user: root
- group: root
- mode: 644
Применяем состояние:
salt '*' state.apply file
Grains и Pillar
Grains — это статические данные, которые описывают свойства миньонов. Эти данные автоматом собираются Salt и могут быть расширены пользователем.
Чтобы просмотреть данные Grains:
salt '*' grains.items
Чтобы получить данные по конкретному grain:
salt '*' grains.item os
Для добавления пользовательских Grains редактируем файл /etc/salt/minion
на миньоне:
grains:
role: webserver
После этого можно получить пользовательский grain командой:
salt '*' grains.item role
Pillar — это динамические данные, которые задаются на мастер-сервере и могут быть переданы на миньоны. Pillar используется для хранения конфиденциальной информации.
Создаем файл /srv/pillar/top.sls
и определите, какие данные будут доступны для каких миньонов:
base:
'*':
- common
'web*':
- webserver
Создаем файл /srv/pillar/common.sls
и добавляем данные:
some_value: 42
Для использования данных Pillar в состоянии создайте SLS файл /srv/salt/example.sls
:
show_pillar:
cmd.run:
- name: echo "Pillar value is {{ pillar['some_value'] }}"
=
Применяем состояние:
salt '*' state.apply example
Salt предлагает несколько методов для целевой выборки миньонов при выполнении команд. Можно использовать имена, регулярные выражения, данные Grains, данные Pillar и другие методы.
Для выборки по имени используем команду:
salt 'minion1' test.ping
или
salt 'web*' test.ping
Для выборки по регулярным выражениям выполните:
salt -E 'web[0-9]+' test.ping
Чтобы выбрать миньонов по конкретному grain, выполните:
salt -G 'os:Ubuntu' test.ping
или
salt -G 'role:webserver' test.ping
Для выборки по данным Pillar выполняем:
salt -I 'some_value:42' test.ping
Для создания более сложных условий можно комбинировать различные методы целевой выборки:
salt -C 'G@os:Ubuntu and I@some_value:42' test.ping
Больше про актуальные решения для управления инфраструктурой эксперты OTUS рассказывают в рамках практических онлайн-курсов. С полным каталогом курсов можно ознакомиться по ссылке.