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.