Инфраструктура SaltStack: настройка salt-cloud для развертывания ресурсов

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

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

Требования

  • Мастер Salt, установленный по этому мануалу.
  • Аккаунт хостинг-провайдера. У вас должна быть возможность использовать API хостинга в команде salt-cloud, чтобы создавать и управлять серверами инфраструктуры. Для этого вам понадобится токен API.

1: Конфигурация облачных миньонов

Для начала создайте конфигурационный файл в /etc/salt/cloud. Эта конфигурация будет использоваться для создания всех миньонов.

sudo nano /etc/salt/cloud

Добавьте ключевое слово minion, с него будет начинаться структура этого файла:

minion:

Ниже укажите IP-адрес мастер-сервера Salt. Этот параметр очень важен, так как именно он помогает миньону подключиться к мастеру после оркестровки.

minion:
master: master_server_ip

Примечание: Файлы YAML требуют очень четкого соблюдения интервалов и отступов.

Затем нужно настроить функции миньонов. Миньоны Salt можно настроить для отправки результатов модулей выполнения Salt в центральный репозиторий на мастер-сервер. Эта система позволяет миньонам обмениваться важной информацией с другими миньонами.

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

minion:
master: master_server_ip
mine_functions:
external_ip:
- mine_function: network.interface_ip
- eth0
internal_ip:
- mine_function: network.interface_ip
- eth1

Сохраните и закройте файл.

2: Настройка облачного провайдера

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

Создайте каталог:

sudo mkdir -p /etc/salt/cloud.providers.d

Внутри создайте файл myprovider.conf:

sudo nano /etc/salt/cloud.providers.d/myprovider.conf

Примечание: Вместо myprovider укажите своего провайдера.

В этом файле нужно создать новую структуру YAML. Ключом верхнего уровня будет здесь имя провайдера (укажите его вместо myprovider). Затем укажите драйвер провайдера для Salt:

myprovider:
driver: my_provider

Теперь вам нужно войти в аккаунт хостинг-провайдера и получить токен API.

Сгенерировав токен, вернитесь в конфигурационный файл и добавьте опцию personal_access_token:

myprovider:
driver: my_provider
personal_access_token: api_token

Затем укажите информацию о ключах SSH. Команде salt-cloud нужно будет войти на серверы через SSH, чтобы настроить миньоны Salt. Добавьте ключ ssh_key_file, чтобы указать точку в файловой системе, где будет храниться закрытый ключ SSH (мы создадим этот файл немного позже). В ssh_key_names нужно указать имя ключа SSH, который вы добавили в свой аккаунт провайдера.

myprovider:
driver: my_provider
personal_access_token: api_token
ssh_key_file: /etc/salt/pki/cloud/mykey.pem
ssh_key_names: Work key,Home key

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

myprovider:
driver: my_provider
personal_access_token: api_token
ssh_key_file: /etc/salt/pki/cloud/mykey.pem
ssh_key_names: Work key,Home key
script: bootstrap-salt
script_args: -P git v2015.8.0

Сохраните и закройте файл. Убедитесь, что мастер видит этот конфигурационный файл.

sudo salt-cloud --list-providers
myprovider:
----------
my_provider:
----------

Чтобы протестировать свой API-ключ, введите:

sudo salt-cloud --list-locations myprovider

Вы увидите список доступных регионов для развертывания.

Создание файла SSH-ключей

Теперь нужно создать файл для хранения закрытого SSH-ключа. Создайте необходимую структуру каталогов:

sudo mkdir -p /etc/salt/pki/cloud

Теперь создайте файл mykey.pem:

sudo nano /etc/salt/pki/cloud/mykey.pem

Вставьте в файл свой закрытый ключ, связанный с одним из открытых ключей, указанных в директиве ssh_key_names в файле провайдера. Обычно вы можете просмотреть свой закрытый ключ с помощью этой команды (на локальной машине):

cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA39KuD8htHaIgUGFezpTsW0Y5XtNuoSTwVg/nih1rlVyKQIkJ
UhJRAakJ9ktQjSWdyAQr0i563WU1KYeHMzQuPPOQAK0vTbMjO5StuzqPEVfPPI1n
PIbMeAg9rjX5Lhy/jSOcTwf0E91jTMYuxkZCMCIDTzeVEFLV744APotQktCruJXf
L53cVUedOI1fQTEKGa1xEk92Ja4jm/Fn+4WKqYVTKRd2/vHX/ej8bI9Pomamskvc
. . .
hd4tdQKBgQCD8s2IbXVfGQ8x0D12a5K7sfysdnESF5I5ladEAoWP4wYctuGdlDso
lBl+jlm1di+1gPqBDMdJhic48ExRBVjKfB1adDeiwhzD4zNxFakhBXHjXHj6MBps
Oo/13JyvRs6QRpBolJfVaG1b5CAR+EhAJkxxCxWch8dlwE1gb9jxXw==
-----END RSA PRIVATE KEY-----

Скопируйте ключ и вставьте его в файл /etc/salt/pki/cloud/mykey.pem, а затем сохраните и закройте файл.

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

sudo chmod 700 /etc/salt/pki/cloud
sudo chmod 600 /etc/salt/pki/cloud/mykey.pem

Теперь Salt может читать файл закрытого ключа и использовать его для входа на новые серверы.

3: Создание профилей

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

Храниться эти файлы будут в каталоге cloud.profiles.d. Создайте этот каталог:

sudo mkdir -p /etc/salt/cloud.profiles.d

В данном мануале используется отдельный файл для каждой среды. Начнем со среды разработки:

sudo nano /etc/salt/cloud.profiles.d/dev-profiles.conf

Начните с указания профиля base-dev. Он будет содержать основные свойства, которыми обладают все машины разработки. В этом руководстве используется 64-битный сервер Ubuntu 14.04 на 1 гигабайт в регионе NYC3. Если миньоны находятся в одном регионе с мастером, это позволит им использовать частные сети для взаимодействия. Имея это в виду, включите поддержку частных сетей и IPv6.

Изменить размер и регион миньона можно с помощью информации, которую вернут эти команды:

sudo salt-cloud --list-locations myprovider
sudo salt-cloud --list-sizes myprovider

Профиль base-dev будет выглядеть так:

base-dev:
provider: myprovider
image: ubuntu-14-04-x64
size: 1gb
location: nyc3
private_networking: True
ipv6: True

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

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

Профиль веб-сервера довольно прост. Он использует все исходные атрибуты и добавляет два зерна. Он использует роль webserver. Чтобы определить среду разработки, нужно указать значение dev:

base-dev:
provider: myprovider
image: ubuntu-14-04-x64
size: 1gb
location: nyc3
private_networking: True
ipv6: True
dev-web:
extends: base-dev
minion:
grains:
role: webserver
env: dev

Профиль базы данных будет работать практически точно так же. Здесь нужно просто использовать роль dbserver вместо webserver и указать идентификатор профиля dev-db:

base-dev:
provider: myprovider
image: ubuntu-14-04-x64
size: 1gb
location: nyc3
private_networking: True
ipv6: True
dev-web:
extends: base-dev
minion:
grains:
role: webserver
env: dev
dev-db:
extends: base-dev
minion:
grains:
role: dbserver
env: dev

Сохраните и закройте файл.

Теперь нужно создать аналогичный профиль для среды обмена данными. Создайте файл:

sudo nano /etc/salt/cloud.profiles.d/stage-profiles.conf

Профиль base-stage почти такой же, как base-dev. Расширения тоже во многом совпадают, отличается только название среды. Также здесь нужно добавить профиль для балансировщика нагрузки (сервера такого типа нет в среде разработки).

base-stage:
provider: myprovider
image: ubuntu-14-04-x64
size: 1gb
location: nyc3
private_networking: True
ipv6: True
stage-web:
extends: base-stage
minion:
grains:
role: webserver
env: stage
stage-db:
extends: base-stage
minion:
grains:
role: dbserver
env: stage
stage-lb:
extends: base-stage
minion:
grains:
role: lbserver
env: stage

Сохраните и закройте файл.

Теперь создайте профиль для среды производства.

sudo nano /etc/salt/cloud.profiles.d/prod-profiles.conf

Эти профили почти полностью совпадают с предыдущими. Нужно только заменить stage на prod.

base-prod:
provider: myprovider
image: ubuntu-14-04-x64
size: 1gb
location: nyc3
private_networking: True
ipv6: True
prod-web:
extends: base-prod
minion:
grains:
role: webserver
env: prod
prod-db:
extends: base-prod
minion:
grains:
role: dbserver
env: prod
prod-lb:
extends: base-prod
minion:
grains:
role: lbserver
env: prod

Сохраните и закройте файл.

Чтобы протестировать профили, введите:

sudo salt-cloud --list-profiles myprovider

4: Создание map

Теперь у вас есть профили, которые точно определяют, как создавать отдельные серверы.

Однако salt-cloud может также использовать дополнительные файлы конфигурации, которые называются map. Эти файлы позволяют ссылаться на созданные профили, чтобы описать всю инфраструктуру, которую нужо построить.

Создайте каталог для map-файлов:

sudo mkdir -p /etc/salt/cloud.maps.d

Теперь нужно определить среду разработки. Создайте и откройте в редакторе файл:

sudo nano /etc/salt/cloud.maps.d/dev-environment.map

Согласно предыдущему руководству, в среде разработки используются два сервера – веб-сервер и сервер БД. Следовательно, map-файл будет выглядеть так:

dev-web:
- dev-web
dev-db:
- dev-db

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

Согласно этому файлу, система создаст веб-сервер dev-web и сервер БД dev-db. Эти серверы salt-cloud может создать одновременно благодаря этому map-файлу. Сохраните и закройте его.

Теперь нужно создать map-файл для среды обмена данными:

sudo nano /etc/salt/cloud.maps.d/stage-environment.map

В этой среде находится два веб-сервера, два сервера БД и один балансировщик нагрузки. Чтобы отличить избыточные серверы друг от друга, добавьте в их имена порядковый номер. Файл будет выглядеть так:

stage-web:
- stage-www1
- stage-www2
stage-db:
- stage-db1
- stage-db2
stage-lb:
- stage-lb

В целом этот файл обеспечивает оркестровку пяти серверов. Сохраните и закройте его.

Осталось только создать файл для среды производства:

sudo nano /etc/salt/cloud.maps.d/prod-environment.map

Этот файл довольно сильно похож на файл промежуточной среды. В среде производства будет дополнительный балансировщик нагрузки.

prod-web:
- prod-www1
- prod-www2
prod-db:
- prod-db1
- prod-db2
prod-lb:
- prod-lb1
- prod-lb2

Сохраните и закройте файл.

5: Тестирование оркестровки среды

Создав все map-файлы, вы можете без труда развернуть одну среду или сразу все среды.

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

Чтобы загрузить сценарий, введите:

sudo salt-cloud -u

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

Как только сценарий загрузится, вы сможете развернуть любую из настроенных сред, используя команду salt-cloud. Для проверки попробуйте запустить среду разработки, поскольку она требует меньше всего ресурсов.

Передайте флаг -P, чтобы сообщить salt-cloud о параллельном создании серверов. Без этого флага система Salt будет ждать, пока завершится загрузка одного сервера, прежде чем приступать к работе над следующим сервером. Также нужно использовать флаг -m и указать map-файл среды.

Полная команда выглядит так:

sudo salt-cloud -P -m /etc/salt/cloud.maps.d/dev-environment.map

Система попросит подтверждения, после чего создаст два сервера:

[INFO    ] salt-cloud starting
[INFO    ] Applying map from '/etc/salt/cloud.maps.d/dev-environment.map'.
[INFO    ] Starting new HTTPS connection (1): api.myprovider.com
The following virtual machines are set to be created:
dev-db
dev-web
Proceed? [N/y]

Чтобы создать серверы, введите Y.

После этого вы можете проверить соединение Salt:

sudo salt '*' test.ping

Вы должны получить ответ от миньона Salt и обеих новых машин разработки. Во время процесса подготовки мастер Salt автоматически генерировал и принимал ключи новых серверов, прежде чем размещать их на миньонах. Потому вам не нужно использовать salt-key для приема каждого из новых ключей. Новые серверы должны немедленно ответить:

dev-db:
True
sm:
True
dev-web:
True

Вы можете использовать map-файл для выдачи команд salt-cloud на определенную группу серверов. Если вы не планируете использовать машины разработки прямо сейчас, вы можете их удалить:

sudo salt-cloud -d -m /etc/salt/cloud.maps.d/dev-environment.map

Эта команда удалит серверы через API и удалит их ключи из хранилища.

Чтобы удалить один конкретный сервер, укажите имя этой машины:

sudo salt-cloud -d dev-db

Если вы это сделаете, в следующий раз salt-cloud создаст по map-файлу только отсутствующие серверы:

sudo salt-cloud -P -m /etc/salt/cloud.maps.d/dev-environment.map
[INFO    ] salt-cloud starting
[INFO    ] Applying map from '/etc/salt/cloud.maps.d/dev-environment.map'.
[INFO    ] Starting new HTTPS connection (1): api.myprovider.com
[WARNING ] u'dev-web' already exists, removing from the create map.
The following virtual machines already exist:
dev-web
The following virtual machines are set to be created:
dev-db
Proceed? [N/y]

Проверьте остальные свои map-файлы самостоятельно.

Заключение

В следующем мануале вы научитесь воспроизводить конфигурацию веб-сервера Nginx.

Tags: , ,