SaltStack, или просто Salt – это мощная система удаленного выполнения и управления конфигурацией, которая позволяет управлять инфраструктурой структурированным и воспроизводимым способом. В этой серии руководств вы научитесь использовать систему состояний Salt для записи и применения повторяемых конфигураций. Это значит, что вы сможете легко создавать новые ноды, которые будут иметь идентичную конфигурацию.
В предыдущем мануале вы научились создавать состояния для установки и настройки веб-сервера Nginx. Данный мануал научит вас создавать состояния для балансировщика нагрузки, который будет обслуживать запросы в промежуточной и производственной среде. Для работы балансировщикам нужны адреса веб-серверов.
1: Главный файл состояния HAProxy
Для распределения трафика между веб-серверами мы будем использовать HAProxy.
Как и в случае с Nginx, сначала нужно создать отдельный каталог для файла состояния:
sudo mkdir /srv/salt/haproxy
Главный файл состояния будет называться init.sls – это позволит вам ссылаться на него по имени каталога.
sudo nano /srv/salt/haproxy/init.sls
В файле можно использовать тот же шаблон, который вы использовали для Nginx, чтобы установить пакет haproxy и убедиться, что он запущен. Также нужно убедиться, что сервис перезагружается при внесении изменений в пакет или изменении файлов /etc/default/haproxy и /etc/haproxy/haproxy.cfg. Не забывайте следить за интервалами в файлах YAML.
haproxy:
pkg:
- installed
service.running:
- watch:
- pkg: haproxy
- file: /etc/haproxy/haproxy.cfg
- file: /etc/default/haproxy
Теперь нужно создать состояния для каждого из файлов сервиса haproxy.
Файл /etc/haproxy/haproxy.cfg будет шаблоном. Этот файл должен будет извлекать информацию о среде и на ее основе составить список веб-серверов для передачи трафика. IP-адреса веб-серверов будут меняться каждый раз. Потому список нужно динамически создавать каждый раз, когда применяется это состояние.
Файл /etc/default/haproxy – это обычный файл. Его нужно отслеживать, чтобы HAProxy мог автоматически загружаться вместе с сервером. Эти данные не являются динамическими, потому для них не нужно создавать шаблон.
haproxy:
pkg:
- installed
service.running:
- watch:
- pkg: haproxy
- file: /etc/haproxy/haproxy.cfg
- file: /etc/default/haproxy
/etc/haproxy/haproxy.cfg:
file.managed:
- source: salt://haproxy/files/etc/haproxy/haproxy.cfg.jinja
- template: jinja
- user: root
- group: root
- mode: 644
/etc/default/haproxy:
file.managed:
- source: salt://haproxy/files/etc/default/haproxy
- user: root
- group: root
- mode: 644
Это все, что должно быть в файле состояния. Сохраните и закройте его.
2: Установка HAProxy и перемещение файлов на мастер Salt
Здесь снова используется знакомая вам технология – нужно установить пакет на миньон HAProxy и передать его файлы на мастер.
Используйте сервер stage-lb – он будет конечной целью файлов. Если вы еще не создали машины промежуточной среды, сделайте это сейчас:
sudo salt-cloud -P -m /etc/salt/cloud.maps.d/stage-environment.map
После этого можно установить haproxy на сервер stage-lb.
sudo salt stage-lb pkg.install haproxy
Как только установка будет завершена, миньон сможет передать два файла, которые нам нужны, на мастер-сервер:
sudo salt stage-lb cp.push /etc/default/haproxy
sudo salt stage-lb cp.push /etc/haproxy/haproxy.cfg
Соответствующие части файловой системы миьона будут воссозданы в каталоге / var / cache /var/cache/salt/master/minions/minion_id/files (в этом случае идентификатор миньона – stage-lb). Скопируйте всю структуру файла миньона в каталог состояний HAProxy:
sudo cp -r /var/cache/salt/master/minions/stage-lb/files /srv/salt/haproxy
Чтобы просмотреть структуру файла, введите:
find /srv/salt/haproxy -printf "%P\n"
files
files/etc
files/etc/default
files/etc/default/haproxy
files/etc/haproxy
files/etc/haproxy/haproxy.cfg
init.sls
Теперь можно удалить сервер балансировщика:
sudo salt-cloud -d stage-lb
Затем можно воссоздать сервер в фоновом режиме, чтобы позже иметь доступ к чистому серверу. Используйте эту команду для мастер-сервера Salt, так как он имеет доступ к соответствующим файлам:
sudo salt --async sm cloud.profile stage-lb stage-lb
Пока сервер создается в фоновом режиме, вы можете продолжить работу и внести все соответствующие поправки в файлы HAProxy.
3: Настройка файла /etc/default/haproxy
Начните с файла /etc/default/haproxy. В каталоге состояний HAProxy на мастере Salt найдите каталог, который содержит этот файл:
cd /srv/salt/haproxy/files/etc/default
Создайте резервную копию исходного файла.
sudo cp haproxy haproxy.orig
Откройте файл в редакторе:
sudo nano haproxy
В строке ENABLED выберите 1. Благодаря этому система инициализации Ubuntu сможет запускать HAProxy вместе с сервером.
# Set ENABLED to 1 if you want the init script to start haproxy.
ENABLED=1
# Add extra flags here.
#EXTRAOPTS="-de -m 16"
Сохраните и закройте файл.
4: Настройка файла /etc/haproxy/haproxy.cfg
Затем приступайте к основному файлу конфигурации HAProxy. Перейдите в соответствующий каталог на мастере Salt:
cd /srv/salt/haproxy/files/etc/haproxy
Создайте резервную копию исходного конфигурационного файла:
sudo cp haproxy.cfg haproxy.cfg.orig
Затем переименуйте файл, чтобы отобразить то, что он является шаблоном Jinja:
sudo mv haproxy.cfg haproxy.cfg.jinja
Откройте этот шаблон:
sudo nano haproxy.cfg.jinja
Начните с установки переменной Jinja. Тут нужно указать среду, в которой работает балансировщик нагрузки, используя функцию выполнения network.interface_ip. Это нужно использовать позже, чтобы составить список веб-серверов одной среды.
{%- set env = salt['grains.get']('env') -%}
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
. . .
Найдите раздел defaults. В mode нужно указать tcp, а в первой строке option – tcplog.
. . .
defaults
. . .
mode tcp
option tcplog
. . .
В конце файла нужно создать раздел frontend, в котором будет описано, как HAProxy будет принимать соединения. Назовите этот раздел «www».
Привяжите его к внешнему IP-адресу сервера. Адрес можно извлечь с помощью функции модуля выполнения network.interface_ip с аргументом eth0. Веб-запросы будут направлены на порт 80. Укажите бэкэнд по умолчанию с помощью опции default_backend. Бэкэнд будет называться nginx_pool.
. . .
frontend www
bind {{ salt['network.interface_ip']('eth0') }}:80
default_backend nginx_pool
После этого нужно добавить бэкэнд nginx_pool. Используйте общепринятый механизм балансировки round robin и укажите tcp.
После этого нужно заполнить список веб-серверов из данной среды. Это можно сделать с помощью цикла for в Jinja. Можно использовать функцию модуля mine.get для получения значения функции my_min, сравнивая роль веб-сервера и среду. Параметр ~env объединит значение переменной env, которое вы установили ранее, с найденной строкой.
Результаты будут храниться в переменных server и addr для каждой итерации цикла. Эти переменные будут добавлять в цикл данные о сервере.
. . .
frontend www
bind {{ salt['network.interface_ip']('eth0') }}:80
default_backend nginx_pool
backend nginx_pool
balance roundrobin
mode tcp
{% for server, addr in salt['mine.get']('G@role:webserver and G@env:' ~ env, 'internal_ip', expr_form='compound').items() -%}
server {{ server }} {{ addr }}:80 check
{% endfor -%}
Сохраните и закройте файл.
5: Тестирование состояния HAProxy
Базовое состояние балансировщика нагрузки готово.
Чтобы протестировать его, используйте сначала state.show_sls. Это отобразит порядок файлов:
sudo salt stage-lb state.show_sls haproxy
По последовательности значений order можно понять, что сначала система будет устанавливать пакет, затем запускать сервис, а затем применять два файла. Изменения файла вызовут перезагрузку сервиса (из-за параметра watch).
Затем можно выполнить пробный прогон состояния. Это поможет обнаружить некоторые (но не все) ошибки, которые могут привести к сбою состояния при запуске:
sudo salt stage-lb state.apply haproxy test=True
Убедитесь, что все состояния были переданы. Независимо от количества сбоев в конце вывода перейдите в начало файла и просмотрите строку Comment для каждого из состояний. Иногда она содержит дополнительную информацию о потенциальных проблемах (даже если тест прошел успешно).
После исправления ошибок, возникающих во время тестирования, вы можете применить состояние к серверам балансировки нагрузки. Все веб-серверы Nginx нужно запустить и настроить до применения состояния.
sudo salt-cloud -P -m /etc/salt/cloud.maps.d/stage-environment.map
sudo salt -G 'role:webserver' state.apply nginx
Когда веб-серверы будут запущены, примените состояние haproxy:
sudo salt -G 'role:lbserver' state.apply haproxy
Теперь вы можете получить доступ к одному из двух веб-серверов бэкэнда через внешний IP-адрес балансировщика нагрузки. Вы можете узнать внешний IP-адрес балансировщика нагрузки с помощью этой команды:
sudo salt -G 'role:lbserver' network.interface_ip eth0
В браузере вы увидите:
Welcome to nginx!
Hello! This is being served from:
stage-www2
Чтобы увидеть, как балансировщик нагрузки передает трафик на серверы бэкэнда, используйте curl:
curl load_balancer_public_IP
<!DOCTYPE html>
<html>
<head>
<title>Welcome from stage-www2</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>Hello! This is being served from:</p>
<h2>stage-www2</h2>
</body>
</html>
Повторите команду через пару минут.
curl load_balancer_public_IP
<!DOCTYPE html>
<html>
<head>
<title>Welcome from stage-www1</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>Hello! This is being served from:</p>
<h2>stage-www1</h2>
</body>
</html>
Как видите, теперь запросы обслуживает другой веб-сервер.
Заключение
В следующем мануале этой серии вы научитесь настраивать систему баз данных MySQL на бэкэкнде. Она будет хранить данные разных сред приложения.