Инфраструктура SaltStack: настройка Salt-Cloud для раскрутки ресурсов DigitalOcean

Вступление

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

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

Предпосылки

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

Вам также понадобится доступ к учетной записи DigitalOcean. Мы будем использовать DigitalOcean API с помощью команды + salt-cloud + для создания и управления серверами, которые будут входить в наши различные среды. Для этого вам потребуется создать токен API, о котором мы расскажем в руководстве.

Создайте конфигурацию Main Cloud Minion

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

sudo nano /etc/salt/cloud

Единственная конфигурация, которую мы будем применять на этом этапе, это параметры + / etc / salt / minion +, которые будут установлены на каждом из создаваемых нами серверов. Используйте клавишу + minion: +, чтобы начать структуру этой информации:

/ И т.д. / соль / облако

minion:

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

/ И т.д. / соль / облако

minion:
 master:

Note

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

Мы хотим установить две мои функции. Они просто вернут публичные и частные IP-адреса миньонов обратно Salt master. Другие миньоны могут затем запросить у мастера эту информацию, чтобы узнать, как подключиться к пирам:

/ И т.д. / соль / облако

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

Сохраните и закройте файл, когда вы закончите.

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

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

Начните с создания каталога для информации о нашем провайдере:

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

Внутри создайте и откройте файл с именем + do.conf +:

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

Внутри мы создадим еще одну структуру YAML. Ключом верхнего уровня в структуре будет имя провайдера. Мы будем использовать «делать» здесь. + Driver + указывает, какое облако использовать. Драйвер DigitalOcean в Salt называется + digital_ocean +:

/etc/salt/cloud.providers.d/do.conf

do:
 driver: digital_ocean

Далее вам нужно зайти в свою учетную запись DigitalOcean и создать токен API. Вы можете перейти в раздел API панели управления, перейдя по ссылке this link. Нажмите кнопку «Создать новый токен» в правом верхнем углу страницы:

изображение: https: //assets.digitalocean.com/articles/salt_series_cloud/generate_new_token.png [токен создания DigitalOcean API]

На следующей странице введите описательное имя и нажмите «Создать токен»:

изображение: https: //assets.digitalocean.com/articles/salt_series_cloud/name_token.png [токен имени DigitalOcean]

Внизу следующей страницы будет отображаться ваш новый токен:

изображение: https: //assets.digitalocean.com/articles/salt_series_cloud/new_token.png [новый токен DigitalOcean]

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

Вернувшись в файл конфигурации вашего провайдера, установите для опции + personal_access_token + значение скопированного вами токена:

/etc/salt/cloud.providers.d/do.conf

do:
 driver: digital_ocean
 personal_access_token:

Далее мы уточним информацию о ключах SSH. Команде + salt-cloud + потребуется сначала войти на серверы, используя SSH, чтобы настроить миньона Salt. Мы установим ключ + ssh_key_file +, чтобы указать место в файловой системе, куда мы вскоре скопируем наш закрытый ключ SSH. Вы должны установить + ssh_key_names + для имени или имен ключа SSH, который вы добавили в DigitalOcean:

/etc/salt/cloud.providers.d/do.conf

do:
 driver: digital_ocean
 personal_access_token:
 ssh_key_file: /etc/salt/pki/cloud/do.pem
 ssh_key_names: ,

Нам также нужно указать скрипт и аргументы скрипта, чтобы мы могли контролировать точную версию Salt, которая будет развернута на новых миньонах:

/etc/salt/cloud.providers.d/do.conf

do:
 driver: digital_ocean
 personal_access_token:
 ssh_key_file: /etc/salt/pki/cloud/do.pem
 ssh_key_names: ,
 script: bootstrap-salt
 script_args: -P git

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

sudo salt-cloud --list-providers
Outputdo:
   ----------
   digital_ocean:
       ----------

Вы можете проверить свой ключ API, набрав:

sudo salt-cloud --list-locations do

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

Создайте файл ключа SSH

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

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

Затем создайте файл с именем + do.pem + во вновь созданном каталоге:

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

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

cat ~/.ssh/id_rsa

Это должно выглядеть примерно так:

~ / .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 / do.pem +, а затем сохраните и закройте файл.

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

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

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

Настройка облачных профилей

Теперь, когда у вас настроен поставщик DigitalOcean, мы можем создавать профили. Эти профили определяют свойства, которые мы хотим использовать при создании новых экземпляров сервера. Мы можем настроить столько, сколько захотим.

Мы будем хранить эти файлы в каталоге + cloud.profiles.d +. Создайте этот каталог сейчас:

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

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

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

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

Мы начнем с определения профиля + base-dev +. Он будет содержать основные свойства, общие для всех наших машин для разработки. Для этого руководства мы указываем, что мы хотим использовать Ubuntu 14.04 64bit на 1-гигабайтной капле в регионе NYC3. NYC3 - это регион, в котором развернут наш Salt master, что позволит нам использовать частные сети для общения при необходимости. Имея это в виду, мы будем включать частные сети (это будет использоваться в нашей конфигурации!), А также IPv6.

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

sudo salt-cloud --list-locations do
sudo salt-cloud --list-sizes do

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

Используя информацию Droplet, которую мы описали выше, наш + base-dev + будет выглядеть так:

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

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

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

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

Профиль для веб-сервера довольно прост. Он использует все исходные атрибуты и добавляет два зерна, которые мы указали. Мы используем роль «веб-сервер». Мы будем противостоять этому на протяжении всего урока. Среда разработки будет обозначена значением «dev»:

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

base-dev:
 provider: do
 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 +»:

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

base-dev:
 provider: do
 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 +. Расширенные профили также близко соответствуют предыдущим определениям, изменяя только среду и имена. Мы также добавили расширенный профиль для нашего балансировщика нагрузки, так как это тип сервера, которого не будет в нашей среде разработки:

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

base-stage:
 provider: do
 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»:

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

base-prod:
 provider: do
 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 do

Вы должны увидеть список всех настроенных вами профилей.

Создание карт среды

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

Однако + salt-cloud + также может использовать дополнительные файлы конфигурации, называемые «maps». Карты позволяют вам ссылаться на созданные нами профили, чтобы наметить всю инфраструктуру, которую вы хотите создать. Вы предоставляете имена серверов, которые вы хотите создать для каждого типа профиля.

Создайте каталог для файлов карт с именем + cloud.maps.d +:

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

Давайте начнем с определения нашей среды разработки. Создайте и откройте файл с именем + dev-environment.map + в этом каталоге:

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

Если вы помните из previous статьи, где были описаны среды, которые мы будем настраивать, наша среда разработки будет иметь только два сервера: веб-сервер и сервер базы данных. Зная это, наш файл карты разработки должен выглядеть так:

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

dev-web:
 - dev-web

dev-db:
 - dev-db

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

В этом примере определяется веб-сервер с именем «dev-web» и сервер базы данных с именем «dev-db». Эти серверы могут быть созданы одновременно, указав + salt-cloud + на этот файл. Сохраните и закройте файл, когда вы закончите.

Далее давайте создадим карту промежуточной среды:

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

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

/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

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

/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

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

Подготовка среды тестирования

Теперь, когда у нас созданы файлы карт, мы можем легко раскрутить любую или все наши среды.

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

Загрузите скрипт начальной загрузки, набрав:

sudo salt-cloud -u

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

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

Мы передадим флаг + -P +, чтобы сообщить + salt-cloud + параллельно создавать серверы. Без этого Солт подождет, пока один сервер завершит загрузку, прежде чем начать работу на следующем сервере. Нам нужно будет использовать флаг + -m + и указать его на карту окружения, которую мы хотим использовать.

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

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

Вам будет предложено подтвердить создание двух серверов, определенных в этом файле:

Output[INFO    ] salt-cloud starting
[INFO    ] Applying map from '/etc/salt/cloud.maps.d/dev-environment.map'.
[INFO    ] Starting new HTTPS connection (1): api.digitalocean.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 +, чтобы принять каждый из новых ключей. Новые серверы должны немедленно ответить:

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

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

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

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

Вы также можете уничтожить отдельные машины по имени:

sudo salt-cloud -d dev-db

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

sudo salt-cloud -P -m /etc/salt/cloud.maps.d/dev-environment.map
Output[INFO    ] salt-cloud starting
[INFO    ] Applying map from '/etc/salt/cloud.maps.d/dev-environment.map'.
[INFO    ] Starting new HTTPS connection (1): api.digitalocean.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]

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

Заключение

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

В этой серии статей мы рассмотрим next, и мы начнем наше погружение в управление конфигурацией Salt. возможности путем настройки воспроизводимой конфигурации Nginx.

Related