Инфраструктура SaltStack: создание состояний Salt для балансировщика нагрузки HAProxy

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 на бэкэкнде. Она будет хранить данные разных сред приложения.

Tags: , ,