22.07.2020

Руководство по использованию платформы Salt

В статье описаны основные понятия платформы Salt, примеры конфигурации и использования с комментариями.

Что это такое?

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

О там как установить и настроить взаимодействие Salt Master и Salt Minions на серверах под управлением операционной системы Ubuntu 18.04 вы можете прочитать в нашей инструкции.

Masters и Minions

Salt Master (Мастер) - это сервер, который выступает в качестве центра управления для своих миньонов, именно от Master отправляются запросы на удаленное выполнение команд. Например, эта команда сообщает текущее использование диска каждым из миньонов, которыми управляет мастер:

salt '*' disk.usage

Таких команд большое множество. Например, вы можете установить NGINX на миньона с именем webserver1:

salt 'webserver1' pkg.install nginx

Salt Minions (Ноды, Миньоны) - это ваши серверы под управлением мастера, именно на них запускаются приложения и сервисы. Каждому миньону присваивается идентификатор, а мастер может ссылаться на этот идентификатор для назначения команд конкретным миньонам.

Связь между мастером и миньонами осуществляется по транспортному протоколу ZeroMQ, канал зашифрован парой открытого и закрытого ключей. Пара ключей генерируется миньоном, после чего он отправляет свой открытый ключ мастеру.

 

Удаленное выполнение

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

salt 'webserver1' npm.install gulp

В этой команде npm - это модуль, а install - это функция. Эта команда устанавливает пакет Gulp Node.js через диспетчер пакетов Node (NPM).

Доступные модули выполнения представляют собой удобные решения для системного администрирования:

Функция cmd.run используется для запуска произвольных команд на управляемых миньонах:

salt '*' cmd.run 'ls -l /etc'

Эта команда выведет содержимое каталога /etc для каждого миньона.

Состояния, формулы и Top-файл

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

Состояния определяются в файлах состояний. После того, как состояния миньонов описаны, они применяются к миньону.

Описание состояния

Ниже приведен пример файла состояния /srv/salt/webserver_setup.sls, который гарантирует, что установлены следующие компоненты: rsync, curl, NGINX, и при этом NGINX запускается и включается при загрузке ОС:

network_utilities:
  pkg.installed:
    - pkgs:
      - rsync
      - curl

nginx_pkg:
  pkg.installed:
    - name: nginx

nginx_service:
  service.running:
    - name: nginx
    - enable: True
    - require:
      - pkg: nginx_pkg

Файлы состояний заканчиваются расширением .sls (SaLt State). Файлы состояний могут иметь одно или несколько описаний состояния, которые являются разделами верхнего уровня (network_utilities, nginx_pkg и nginx_service в приведенном выше примере). Идентификаторы описаний являются произвольными, поэтому вы можете называть их по своему усмотрению.

Описания состояний содержат модули состояний. Модули состояний отличаются от модулей выполнения, но часто выполняют аналогичные задания. Например, существует модуль состояния pkg с функциями, аналогичными модулю выполнения pkg, как с функцией состояния pkg.installed и функцией выполнения pkg.install.

Файлы состояний - это просто наборы словарей, списков, строк и чисел, которые затем интерпретирует Salt. По умолчанию Salt использует синтаксис YAML для представления состояний.

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

Применение состояния к Миньону

Чтобы применить состояние к миньону, используйте функцию state.apply от имени мастера:

salt `webserver1` state.apply webserver_setup

Эта команда применяет пример состояния webserver_setup.sls к миньону с именем webserver1. При применении состояния суффикс .sls не упоминается. Применяются все описания состояния из файла состояния.

Формулы

Формулы - это просто наборы состояний, которые вместе настраивают компонент приложения или системы на миньоне. Формулы обычно организованы с помощью нескольких различных файлов .sls. Разделение состояний формулы по разным файлам может упростить организацию вашей работы. Объявления состояний могут включать и ссылаться на объявления в других файлах.

Top-файл

В дополнение к ручному применению состояний к миньонам, Salt предоставляет возможность автоматически отобразить, какие состояния должны применяться к различным миньонам. Это называется Top-файлом.

Простой пример файла /srv/salt/top.sls:

base:
  '*':
    - universal_setup

  'webserver1':
    - webserver_setup

base это среда окружения. Вы можете указать более одной среды, соответствующей различным этапам вашей работы; например: разработка, QA, производство.

В приведенном выше примере сказано, что состояние universal_setup должно применяться ко всем миньонам ('*'), а состояние webserver_setup должно применяться только к миньону webserver1.

Если вы запустите функцию state.apply без аргументов, Salt проверит Top-файл и применит все состояния в нем в соответствии с созданным отображением:

salt '*' state.apply

Хранение Data (данных) и Secrets (секретов)

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

Допустим, вы хотите создать системных пользователей для миньонов и назначить разные оболочки для каждого из них. Можно закодировать эту информацию в файл состояния, но для этого потребуется новое объявление для каждого пользователя. Если вы вместо этого сохраняете данные в Pillar, можно просто создать одно объявление состояния и вставить в него данные.

Такие данные хранятся в файлах .sls, например файла /srv/pillar/user_info.sls:

users:
  joe:
    shell: /bin/zsh
  amy:
    shell: /bin/bash
  sam
    shell: /bin/fish

Как и в случае с файлами состояний, Top-файл (отдельно от Yop-файла состояний) отображает данные Pillar в миньоны, например /srv/pillar/top.sls:

base:
  'webserver1':
    - user_info

Шаблоны Jinja

Для использования данных Pillar в файлах состоянии, используют шаблоны Jinja.

Ниже приведен пример файла состояния /srv/salt/user_setup.sls, в котором используются данные Pillar из предыдущей секции для создания пользователей системы и установки оболочки:

{% for user_name, user_info in pillar['users'].iteritems() %} {{ user_name }}: user.present: - shell: {{ user_info['shell'] }} {% endfor %}

Salt скомпилирует файл состояния в подобный файл прежде чем применить его к миньону:

joe:
  user.present:
    - shell: /bin/zsh
amy:
  user.present:
    - shell: /bin/bash
sam:
  user.present:
    - shell: /bin/fish

В следующем примере файл состояния /srv/salt/webserver_setup.sls установит Apache и настроит имя для пакета в соответствии с операционной системой:

install_apache:
  pkg.installed:
    {% if grains['os'] == 'CentOS' %}
    - name: httpd
    {% else %}
    - name: apache
    {% endif %}

Дополнительную информацию можно найти в официальной документации продукта.