Вступление
SaltStack, или Salt, является мощной системой удаленного выполнения и управления конфигурацией, которую можно использовать для простого управления инфраструктурой структурированным, воспроизводимым способом. В этой серии мы покажем один метод управления средой разработки, промежуточной и производственной сред из развертывания Salt. Мы будем использовать систему состояний соли для написания и применения повторяемых действий. Это позволит нам уничтожить любую из наших сред, будучи уверенными в том, что мы можем легко вернуть их в прежнее состояние в будущем.
В last руководстве в этой серии мы настроили HAProxy в качестве балансировщика нагрузки в перед нашими веб-серверами. В этом руководстве мы изменим наше внимание на создание состояний, которые будут устанавливать наши серверы баз данных MySQL и управлять ими в каждой из наших сред. Эта статья расскажет об основной установке и настройке MySQL. В будущем руководстве мы рассмотрим более сложную задачу настройки репликации.
Получите информацию о подсказке MySQL с помощью debconf-utils
Процесс создания наших состояний MySQL будет немного сложнее, чем в наших предыдущих примерах с Nginx и MySQL. В отличие от двух других этапов установки, установка MySQL, как правило, включает ответ на набор запросов для установки корневого пароля MySQL.
Прежде чем мы начнем с нашим файлом состояния, мы должны выполнить тестовую установку MySQL на одном из наших миньонов. Затем мы можем использовать пакет + debconf-utils +
, чтобы получить информацию о подсказках, которые нам нужно будет заполнить.
Если у вас еще нет доступной промежуточной среды, вы можете использовать файл карты промежуточной среды, который мы создали ранее, для ускорения среды:
sudo salt-cloud -P -m /etc/salt/cloud.maps.d/stage-environment.map
Когда ваши серверы баз данных будут готовы и доступны, выберите один из ваших серверов баз данных для установки MySQL, чтобы мы могли получить соответствующую информацию из установки:
sudo salt stage-db1 pkg.install mysql-server
Чтобы легко запрашивать базы данных + debconf +
для получения необходимой нам оперативной информации, мы также должны установить пакет + debconf-utils +
в базе данных minion:
sudo salt stage-db1 pkg.install debconf-utils
Функция + debconf +
в Salt будет доступна теперь, когда этот пакет установлен. Мы можем использовать функцию модуля исполнения + debconf.get_selections +
, чтобы получить всю информацию о подсказке от миньона базы данных. Мы должны передать это в + less +
, потому что это вернет all информации из пакетов, установленных на этом хосте:
sudo salt stage-db1 debconf.get_selections | less
В выводе ищите раздел, который включает MySQL. Это должно выглядеть примерно так:
Output. . .
mysql-server-5.5:
|_
|_
|_
- mysql-server-5.5/really_downgrade
- boolean
- false
|_
- mysql-server-5.5/start_on_boot
- boolean
- true
. . .
Две верхние записи содержат имена полей, которые нам нужны (+ mysql-server / root_password +
и + mysql-server / root_password_again +
). Во второй строке этих записей указывается тип поля, который нам нужно будет указать в нашем файле состояния.
После того, как вы скопировали эту информацию из вывода + debconf +
, мы также должны пойти дальше и взять файл + / etc / mysql / my.cnf +
. Это потребуется нам позже, когда мы настроим наши состояния MySQL:
sudo salt stage-db1 cp.push /etc/mysql/my.cnf
После отправки файла + / etc / mysql / my.cnf
обратно в мастер соли, мы можем удалить ресурс, чтобы у нас был чистый лист для тестирования позже в руководстве:
sudo salt-cloud -d stage-db1
После того как сервер удален, вы можете восстановить его в фоновом режиме, набрав следующее. + Sm +
в данном случае - это имя нашего главного сервера Salt, который имеет соответствующие учетные данные облака:
sudo salt --async cloud.profile stage-db stage-db1
Пока ваш сервер базы данных перестраивается, мы можем приступить к созданию файла состояния MySQL.
Создайте основной файл состояния MySQL
Мы начнем с создания каталога для нашего состояния MySQL в каталоге + / srv / salt +
:
sudo mkdir -p /srv/salt/mysql
В этом каталоге мы можем создать и открыть файл + init.sls +
для хранения нашего основного файла состояния MySQL:
sudo nano /srv/salt/mysql/init.sls
Нам нужно убедиться, что на миньоне установлен пакет + debconf-utils +
, чтобы легко устанавливать нужные нам значения. Мы можем сделать это с помощью модуля состояния + package.installed
:
/srv/salt/mysql/init.sls
debconf-utils:
pkg.installed
После установки пакета + debconf-utils +
мы можем предварительно заполнить ответы на приглашения, используя модуль состояния + debconf.set +
. Мы будем использовать атрибут + name +
, чтобы указать имя пакета, для которого мы хотим установить приглашения. Затем мы создаем структуру + data +
, которая содержит словарь информации, который можно использовать для заполнения приглашений.
Структура + data +
в основном использует информацию о приглашениях, которые мы запросили из нашей тестовой установки MySQL. Мы знаем имена полей и типы данных, которые должны использоваться для этих полей. Чтобы указать действительный пароль, мы извлечем из системы Salt pillar функцию «+ pillar.get +».
Мы установим пароль в системе столба чуть позже. Это позволит нам хранить данные вашего пароля отдельно от нашей конфигурации.
Note
/srv/salt/mysql/init.sls
debconf-utils:
pkg.installed
mysql_setup:
debconf.set:
- name: mysql-server
- data:
'mysql-server/root_password': {'type': 'password', 'value': '{{ salt['pillar.get']('mysql:root_pw', '') }}' }
'mysql-server/root_password_again': {'type': 'password', 'value': '{{ salt['pillar.get']('mysql:root_pw', '') }}' }
- require:
- pkg: debconf-utils
Чтобы реально взаимодействовать с MySQL, на серверах базы данных должны быть доступны соответствующие библиотеки Python. Мы можем установить пакет + python-mysqldb
, чтобы обеспечить доступ к возможностям Salt MySQL. После этого мы можем безопасно установить реальное программное обеспечение сервера MySQL. Мы будем использовать + require +
, чтобы гарантировать, что + debconf +
и библиотеки Python доступны.
После установки мы можем добавить состояние службы, чтобы убедиться, что служба запущена. Это будет следить за изменениями в пакете сервера MySQL. Он также будет наблюдать основной файл конфигурации MySQL и перезагрузит службу, если обнаружены изменения:
/srv/salt/mysql/init.sls
debconf-utils:
pkg.installed
mysql_setup:
debconf.set:
- name: mysql-server
- data:
'mysql-server/root_password': {'type': 'password', 'value': '{{ salt['pillar.get']('mysql:root_pw', '') }}' }
'mysql-server/root_password_again': {'type': 'password', 'value': '{{ salt['pillar.get']('mysql:root_pw', '') }}' }
- require:
- pkg: debconf-utils
Есть несколько файлов, которые нам понадобятся для работы с MySQL. Самый очевидный файл, которым нам нужно управлять, это файл + / etc / mysql / my.cnf
, который мы упоминали выше. Нам нужно будет внести некоторые изменения на основе информации о переменных, поэтому этот файл должен быть шаблоном Jinja.
Другие файлы, которыми мы должны управлять, связаны с управлением Salt системами MySQL. Для управления базами данных у Salt minion должна быть информация о том, как подключиться к RDBMS. Во-первых, мы можем создать простой файл в каталоге + / etc / salt / minion.d +
. Это просто перечислит файл, в котором можно найти информацию о наших соединениях. Файл с деталями соединения с базой данных - это другой файл, который нам понадобится для управления. Файл подключения к базе данных должен быть шаблоном:
/srv/salt/mysql/init.sls
. . .
mysql:
service.running:
- watch:
- pkg: mysql-server
- file: /etc/mysql/my.cnf
Наконец, нам нужно включить состояние + service.restart +
, которое перезагрузит сам процесс + salt-minion +
. Это необходимо для того, чтобы наш миньон взял файл + / etc / salt / minion.d / mysql.conf +
. Мы хотим, чтобы + salt-minion +
перезапускался только тогда, когда произошли изменения в самом файле + / etc / salt / minion.d / mysql.conf +
. Мы можем использовать реквизит + watch +
для этого:
/srv/salt/mysql/init.sls
. . .
/etc/mysql/salt.cnf:
file.managed:
- source: salt://mysql/files/etc/mysql/salt.cnf.jinja
- template: jinja
- user: root
- group: root
- mode: 640
- require:
- service: mysql
Когда вы закончите добавлять детали выше, сохраните и закройте файл.
Создайте Столпы для MySQL
В нашем состоянии MySQL мы использовали функцию исполнительного модуля + pillar.get +
, чтобы заполнить корневой пароль MySQL значением из системы pillar. Нам нужно настроить этот столб, чтобы государство могло получать необходимые данные для создания учетных данных базы данных.
Система Pillar идеально подходит для этого варианта использования, поскольку позволяет назначать данные определенным хостам. Несоответствующие хосты не будут иметь доступа к конфиденциальным данным. Пока что нашему государству нужен только пароль root. Мы определили расположение в системе столбов как + mysql: root_pw +
. Теперь перейдем к настройке этого ключа.
Создание верхнего файла для системы Pillar
Прежде чем мы создадим нужные нам файлы столба MySQL, нам нужно создать «верхний» файл столба. Верхний файл используется для сопоставления миньонов соли с данными столба. Миньоны соли не смогут получить доступ к данным столба, которые не совпадают в верхнем файле.
Каталог + / srv / pillar +
должен был быть создан во время руководства по установке. Мы можем создать файл + top.sls +
в этом каталоге, чтобы начать:
cd /srv/pillar
sudo nano top.sls
Внутри нам нужно указать среду + base +
(мы не используем концепцию Salt для сред в этой серии из-за сложности и некоторого недокументированного поведения. Все наши серверы работают в среде + base +
и используют зерна для обозначения среды). Мы будем использовать составное сопоставление для сопоставления узлов. Мы сопоставим роль сервера и среду сервера, чтобы определить, какие столбцы назначать каждому хосту.
Столбы используют точечные обозначения для обозначения файлов в каталоге. Например, корнем системы столбов является + / srv / pillar +
. Чтобы назначить столбик + mysql.sls
, расположенный в каталоге` + dev + , мы используем
+ dev.mysql`.
Задание, которое нам понадобится для этого руководства, выглядит следующим образом:
/srv/pillar/top.sls
base:
'G@env:dev and G@role:dbserver':
- match: compound
- dev.mysql
'G@env:stage and G@role:dbserver':
- match: compound
- stage.mysql
'G@env:prod and G@role:dbserver':
- match: compound
- prod.mysql
Сохраните и закройте файл, когда вы закончите.
Создание экологических столбов
Выше мы назначили столбы для серверов в зависимости от роли и среды. Это позволяет нам указывать различную информацию о соединении и учетных данных для разных сред.
Начните с создания каталогов, указанных в верхнем файле колонны:
sudo mkdir /srv/pillar/{prod,stage,dev}
Затем мы должны создать файл + mysql.sql
в каждом из этих каталогов. Мы можем начать с файла + / srv / salt / stage / mysql.sls +
, поскольку в настоящее время мы используем промежуточную среду для тестирования:
sudo nano /srv/pillar/stage/mysql.sls
Файл состояния, который мы создали, хочет получить пароль root для MySQL из системы pillar, используя ключ + mysql: root_pw +
. На самом деле это вложенный ключ, означающий, что + root_pw +
является потомком ключа + mysql +
. Имея это в виду, мы можем выбрать пароль для нашего корневого пользователя MySQL и установить его в файле следующим образом:
/srv/pillar/stage/mysql.sls
mysql:
root_pw:
Выберите любой пароль, который вы хотели бы использовать. Когда вы закончите, сохраните и закройте файл. Это все, что нам нужно на данный момент.
Создайте аналогичный файл в рамках разработки:
sudo nano /srv/pillar/dev/mysql.sls
/srv/pillar/dev/mysql.sls
mysql:
root_pw:
Сделайте то же самое для вашей производственной среды:
sudo nano /srv/pillar/prod/mysql.sls
/srv/pillar/prod/mysql.sls
mysql:
root_pw:
Выберите разные пароли для каждой из этих сред.
Мы вернемся к этим столбам позже, так как нам нужно больше данных, которые не принадлежат самой конфигурации. Пока что сохраняйте и закрывайте все открытые файлы.
Создайте шаблон /etc/mysql/my.cnf.jinja
Мы создали наш основной файл состояния MySQL ранее, но мы никогда не создавали управляемые файлы для установки.
Когда мы ранее делали тестовую установку + mysql-server +
на нашем сервере + stage-db1 +
, мы возвращали файл + / etc / mysql / my.cnf
обратно в мастер. Это все еще должно быть доступно в нашем мастер-кеше Salt. Мы можем скопировать всю структуру каталогов, ведущую к этому файлу кэша, в наш каталог + + srv / salt / mysql + `, набрав:
sudo cp -r /var/cache/salt/master/minions/stage-db1/files /srv/salt/mysql
Перейдите в каталог, содержащий скопированный файл + mycnf +
в каталоге состояния MySQL:
cd /srv/salt/mysql/files/etc/mysql
Скопируйте файл в том виде, в котором он существует в данный момент, в суффикс + .orig +
, чтобы мы могли отменить изменения при необходимости:
sudo cp my.cnf my.cnf.orig
Затем переименуйте файл + my.cnf +
, чтобы получить суффикс + .jinja +
. Это сразу покажет нам, что этот файл является шаблоном, а не файлом, который можно перенести на хост без рендеринга:
sudo mv my.cnf my.cnf.jinja
Откройте файл шаблона Jinja, чтобы начать необходимые изменения:
sudo nano my.cnf.jinja
Все изменения, которые мы хотим создать, связаны с разрешением удаленных подключений MySQL. В своем нынешнем виде MySQL привязан к локальному интерфейсу обратной связи. Мы хотим настроить это, чтобы прослушивать частный сетевой адрес узла.
Для этого найдите строку + bind-address
в разделе` + [mysqld] + . Мы будем использовать функцию модуля исполнения `+ network.interface_ip +
, чтобы получить адрес, назначенный интерфейсу миньона + eth1 +
.
/srv/salt/mysql/files/etc/mysql/my.cnf.jinja
. . .
[mysqld]
. . .
bind-address =
Другое добавление, которое нам нужно сделать, - отключить разрешение DNS-имен для наших серверов. Добавив параметр + skip-name-resol +
, MySQL не завершится с ошибкой, если не сможет завершить преобразование имени и обратного имени:
/srv/salt/mysql/files/etc/mysql/my.cnf.jinja
. . .
[mysqld]
. . .
bind-address = {{ salt['network.interface_ip']('eth1') }}
Сохраните и закройте файл, когда вы закончите.
Создайте файл /etc/salt/minion.d/mysql.conf
Далее нам нужно создать управляемый файл, который будет использоваться для изменения конфигурации миньона со знанием того, как подключиться к базе данных MySQL. Вместо того, чтобы хранить конфигурацию внутри самого файла + / etc / salt / minion +
, мы поместим новый файл в каталог + / etc / salt / minion.d +
, сообщающий миньону, где найти информацию о соединении.
Начните с создания необходимой структуры каталогов в каталоге + / srv / salt / mysql / files
:
sudo mkdir -p /srv/salt/mysql/files/etc/salt/minion.d
Мы можем создать файл в этом каталоге с именем + mysql.conf +
:
sudo nano /srv/salt/mysql/files/etc/salt/minion.d/mysql.conf
Внутри нам нужно установить только одну опцию: расположение файла информации о соединении. В нашем случае мы установим это в файл + / etc / mysql / salt.cnf +
:
/srv/salt/mysql/files/etc/salt/minion.d/mysql.conf
mysql.default_file: '/etc/mysql/salt.cnf'
Сохраните и закройте файл, когда вы закончите.
Создайте файл шаблона /etc/mysql/salt.cnf
Теперь нам нужно создать файл, на который ссылается наша конфигурация миньонов. Это будет файл шаблона, так как нам нужно получить некоторые детали соединения из системы столба. Мы поместим этот файл в каталог + / srv / salt / mysql / files / etc / mysql
:
sudo nano /srv/salt/mysql/files/etc/mysql/salt.cnf.jinja
Внутри нам нужно открыть раздел + [client] +
, чтобы указать тип информации, которую мы определяем. Ниже этого заголовка мы можем указать, чтобы клиент подключался к локальной машине с корневым пользователем MySQL через сокет Unix, расположенный в + / var / run / mysqld / mysqld.sock +
. Все эти значения MySQL по умолчанию:
/srv/salt/mysql/files/etc/mysql/salt.cnf.jinja
[client]
host = localhost
user = root
socket = /var/run/mysqld/mysqld.sock
Единственное, что нам нужно добавить, это пароль. Опять же, мы извлечем это непосредственно из системы pillar так же, как и в разделе + debconf +
нашего файла состояния MySQL. Это будет выглядеть примерно так:
/srv/salt/mysql/files/etc/mysql/salt.cnf.jinja
[client]
host = localhost
user = root
socket = /var/run/mysqld/mysqld.sock
Сохраните и закройте файл, когда вы закончите.
Тестовая установка и проверка работоспособности
Теперь, когда мы настроили базовое состояние установки и поддерживающие файлы, мы должны быстро протестировать нашу настройку, чтобы убедиться, что она работает правильно.
Мы начнем с нашего обычного процесса тестирования. Используйте функцию исполняющего модуля + state.show_sls +
, чтобы убедиться, что она может отобразить ваш файл состояния:
sudo salt stage-db1 state.show_sls mysql
Просмотрите вывод, чтобы убедиться, что у Salt нет проблем с анализом вашего файла + / srv / salt / mysql / init.sls +
.
Затем выполните пробный запуск приложения состояния, добавив + test = True +
в конец функции исполнительного модуля + state.apply +
:
sudo salt stage-db1 state.apply mysql test=True
-
Ожидается, что эта команда не выполнится *. Поскольку некоторые функции состояния в нашем файле недоступны до тех пор, пока не будут установлены определенные пакеты, ожидается сбой во время пробного запуска. Во время фактического выполнения упорядочение состояний обеспечит установку необходимых пакетов before вызваны состояния, которые их используют.
Во всех комментариях к ошибочным состояниям должно быть указано, что «один или несколько реквизитов не выполнены», за исключением состояния «+ mysql_setup », которое должно завершиться сбоем из-за недоступности ` debconf.set +` (это просто еще одно обязательное условие отказа). ). Используйте выходные данные, чтобы убедиться, что другие несвязанные ошибки не обнаружены.
После запуска теста мы можем применить состояние, набрав:
sudo salt stage-db1 state.apply mysql
Это должно привести к успешному запуску состояния.
Нам нужно проверить, что Salt может подключаться и запрашивать базу данных MySQL. Убедитесь, что вы можете получить список баз данных по умолчанию, набрав:
sudo salt stage-db1 mysql.db_list
Вы должны получить список, который выглядит примерно так:
Outputstage-db1:
- information_schema
- mysql
- performance_schema
Это указывает на то, что Salt смог подключиться к экземпляру MySQL, используя информацию, указанную в файле + / etc / mysql / salt.cnf +
.
Теперь, когда мы убедились, что наше базовое состояние MySQL работает правильно, мы можем удалить сервер + stage-db1 +
:
sudo salt-cloud -d stage-db1
Создайте сервер в фоновом режиме, чтобы он был у нас для дальнейшего тестирования позже. Опять же, + sm +
- это имя нашего главного сервера Salt в этом случае:
sudo salt --async cloud.profile stage-db stage-db1
Теперь наша базовая настройка MySQL завершена.
Заключение
Теперь у вас должны быть состояния, которые установят MySQL на ваших миньонов. Они также запускают процесс + salt-minion +
на каждом из этих серверов, так что Salt может подключаться к базам данных и управлять ими.
В то время как наши текущие состояния устанавливают MySQL и настраивают наших миньонов для управления системами баз данных, в настоящее время наши базы данных полностью разделены. В будущем руководстве мы рассмотрим репликацию базы данных MySQL, чтобы наши данные были согласованными для каждой из наших баз данных в каждой среде.