Привет, Хабр!

Salt (также известный как SaltStack) — это открытое решение, которое позволяет управлять конфигурациями тысяч серверов и устройств. В основе Salt лежит архитектура "мастер-миньон", где мастер-сервер контролирует и управляет подчиненными миньонами.

Salt имеет большой набор инструментов для выполнения удаленных команд, управления состояниями систем, а также для оркестрации и автоматизации различных аспектов инфраструктуры.

Начнем с установки и настройки Salt, а затем перейдем к выполнению базовых команд и управлению конфигурациями с помощью Salt States.

Установка Salt

Salt Master — это сервер, который управляет всеми миньонами (minions). Вот как его установить:

  1. Открываем терминал на сервере, который хочется использовать в качестве мастер-сервера.

  2. Устанавливаем Salt Master с помощью пакетного менеджера ОС. Например, для Ubuntu есть команда:

    sudo apt-get install salt-master
  3. Настраиваем Salt Master. редактируем файл конфигурации, расположенный по адресу /etc/salt/master, под свои нужды.

  4. Запускаем службу Salt Master:

    sudo systemctl start salt-master

Миньоны (minions) — это управляемые серверы. Установим:

  1. Открываем терминал на каждом сервере, которым нужно управлять.

  2. Устанавливаем Salt Minion:

    sudo apt-get install salt-minion
  3. Настраиваем миньон. редактируем файл конфигурации /etc/salt/minion, указав адрес мастера:

    master: <IP-адрес-мастера>
  4. Запускаем службу Salt Minion:

    sudo systemctl start salt-minion

После установки и настройки миньонов, их нужно подключить к мастеру:

  1. Применяем ключи миньонов на мастер-сервере, чтобы разрешить подключение:

    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 файлы.

Создаем:

  1. Создаем каталог для файлов состояний:

    sudo mkdir -p /srv/salt
  2. Создаем новый SLS файл:
    Например, nginx.sls:

    sudo nano /srv/salt/nginx.sls
  3. Добавляем конфигурацию в SLS файл:
    Вставляем следующий код в файл nginx.sls:

    install_nginx:
      pkg.installed:
        - name: nginx
    
    start_nginx:
      service.running:
        - name: nginx
        - enable: True
        - require:
          - pkg: install_nginx

Применяем файл:

  1. Применяем состояние ко всем миньонам:
    Исполнзуйте команду state.apply для применения состояния:

    salt '*' state.apply nginx
  2. Проверьте результат выполнения:
    После выполнения команды видим вывод, показывающий результаты применения состояния на каждом миньоне:

    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 рассказывают в рамках практических онлайн-курсов. С полным каталогом курсов можно ознакомиться по ссылке.

Комментарии (4)


  1. MetaDone
    29.05.2024 05:33
    +2

    Миньоны (minions) — это управляемые серверы. Установим:

    1. Открываем терминал на каждом сервере, которым нужно управлять.

    или можно сделать это через ansible. вообще и все остальное можно и агентов не нужно устанавливать. и синтаксис похож. не понятно почему бы ansible не использовать в таком случае


    1. skeletor
      29.05.2024 05:33

      Кто-то может назвать установку агентов недостатком, но для меня - преимущество. Особенно тогда, когда невозможно (причин может быть много, от ошибка конфигурации в ssh до банального зависания) подключиться по ssh. Очень много раз спасало именно наличие minion: просто отдаешь ему команду на выполнение. Да, не всегда с первого раза, но в данном случае уже есть установленное соединение по которому можно отправить команду. Не нужно делать новое сетевое подключение, не нужно ждать согласование cipher'ов и прочего.

      Опять же. Если у вам "дешевле" отправить сервер в reboot, то salt проигрывает ansibl'y, но если сервер крайне не желательно перезагружать, и иметь дополнительную возможность подключения - преимущество у salt'a.


    1. 5exi
      29.05.2024 05:33

      Это больше вопрос религии, что досталось в наследство и что привычнее. Агенты не так и плохи как думаешь. Они однозначно быстрее любых других нативных способов коммуникации с серверами.


  1. erley
    29.05.2024 05:33
    +1

    Ansible лучше, он использует штатные средства на управляемых серверах, ничего устанавливать не нужно (лишние сущности могут сломаться или глючить).
    К тому же он декларативный, с хорошей организацией описания конфигурации - роли, плейбуки, модули.