Оркестрация конфигурациями с помощью SaltStack

от автора

Привет, Хабр!

SaltStack — это целая экосистема, предназначенная для автоматизации сложных процессов и оркестрации множества систем. Сегодня мы рассмотрим, как SaltStack помогает решить задачи оркестрации.

Немного про сам SaltStack

SaltStack состоит из основных компонентов: Salt Master, Salt Minion.

Salt Master

Salt Master — это центральный сервер, который управляет миньонами (агентами) и распределяет команды. Основные функции:

  • Командное управление: отправка команд миньонам для выполнения различных задач.

  • Сбор данных: получение информации о состоянии миньонов.

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

Salt Minion

Salt Minion — это агент, установленный на управляемом узле (сервере, виртуальной машине и т.д.). Он выполняет функции:

  • Выполнение команд: принимает и исполняет команды от мастера.

  • Сбор данных: отправляет данные о состоянии системы мастеру.

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

Подробнее с сам SaltStack можно прочитать здесь.

Оркестрация с помощью SaltStack

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

Salt Orchestrate Runner — это инструмент в SaltStack, который позволяет управлять и координировать выполнение задач на нескольких узлах. Он используется для написания и выполнения оркестрационных сценариев, которые могут включать выполнение команд, применение состояний и управление конфигурациями.

Простой сценарий оркестрации может включать выполнение команды на нескольких узлах:

# /srv/salt/orchestrate/simple_orchestrate.sls execute_command:   salt.function:     - name: cmd.run     - tgt: '*'     - arg:       - echo "Hello, world!"

Здесь сценарий /srv/salt/orchestrate/simple_orchestrate.sls определяет задачу execute_command, которая использует функцию cmd.run для выполнения команды echo "Hello, world!" на всех узлах (tgt: '*').

В сценарии посложней можно выполнить задачи последовательно:

# /srv/salt/orchestrate/complex_orchestrate.sls prepare_servers:   salt.state:     - tgt: 'web*'     - sls: webserver.setup  deploy_application:   salt.state:     - tgt: 'app*'     - sls: app.deploy     - require:       - salt: prepare_servers

В этом примере сначала выполняется состояние webserver.setup на узлах с меткой web*, а затем состояние app.deploy на узлах с меткой app*, но только после успешного завершения первой задачи.

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

Пример создания SLS файла:

# /srv/salt/webserver/setup.sls install_nginx:   pkg.installed:     - name: nginx  start_nginx:   service.running:     - name: nginx     - enable: True     - require:       - pkg: install_nginx

Здесь SLS файл /srv/salt/webserver/setup.sls определяет два состояния: установка пакета nginx и запуск сервиса nginx. Условие require гарантирует, что сервис будет запущен только после установки пакета.

Для выполнения SLS файла используется команда salt-run или salt:

salt 'web*' state.apply webserver.setup

Эта команда применяет состояния, определенные в webserver.setup, на всех узлах, соответствующих шаблону web*.

Как все это выглядит на практике

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

Настройка балансировщика нагрузки с Nginx

Создадим SLS файл для установки Nginx:

# /srv/salt/loadbalancer/install_nginx.sls install_nginx:   pkg.installed:     - name: nginx  configure_nginx:   file.managed:     - name: /etc/nginx/nginx.conf     - source: salt://loadbalancer/nginx.conf     - user: root     - group: root     - mode: 644     - require:       - pkg: install_nginx  start_nginx:   service.running:     - name: nginx     - enable: True     - require:       - file: configure_nginx

Пример конфигурационного файла Nginx:

# /srv/salt/loadbalancer/nginx.conf user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid;  events {     worker_connections 1024; }  http {     log_format main '$remote_addr - $remote_user [$time_local] "$request" '                       '$status $body_bytes_sent "$http_referer" '                       '"$http_user_agent" "$http_x_forwarded_for"';          access_log /var/log/nginx/access.log main;      sendfile on;     tcp_nopush on;     tcp_nodelay on;     keepalive_timeout 65;     types_hash_max_size 2048;      include /etc/nginx/mime.types;     default_type application/octet-stream;      upstream backend {         server webserver1.example.com;         server webserver2.example.com;     }      server {         listen 80;         server_name example.com;          location / {             proxy_pass http://backend;             proxy_set_header Host $host;             proxy_set_header X-Real-IP $remote_addr;             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;             proxy_set_header X-Forwarded-Proto $scheme;         }     } }

Применение конфигурации:

salt 'loadbalancer*' state.apply loadbalancer.install_nginx

Последовательная конфигурация всех серверов кластера

Создадим SLS файл для установки и настройки веб-сервера:

# /srv/salt/webserver/setup.sls install_nginx:   pkg.installed:     - name: nginx  configure_nginx:   file.managed:     - name: /etc/nginx/nginx.conf     - source: salt://webserver/nginx.conf     - user: root     - group: root     - mode: 644     - require:       - pkg: install_nginx  start_nginx:   service.running:     - name: nginx     - enable: True     - require:       - file: configure_nginx

Пример конфигурационного файла для веб-сервера:

# /srv/salt/webserver/nginx.conf user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid;  events {     worker_connections 1024; }  http {     log_format main '$remote_addr - $remote_user [$time_local] "$request" '                       '$status $body_bytes_sent "$http_referer" '                       '"$http_user_agent" "$http_x_forwarded_for"';          access_log /var/log/nginx/access.log main;      sendfile on;     tcp_nopush on;     tcp_nodelay on;     keepalive_timeout 65;     types_hash_max_size 2048;      include /etc/nginx/mime.types;     default_type application/octet-stream;      server {         listen 80;         server_name webserver.example.com;          location / {             root /usr/share/nginx/html;             index index.html index.htm;         }     } }

Применение конфигурации на всех веб-серверах:

salt 'web*' state.apply webserver.setup

Автоматизация и мониторинг с помощью SaltStack

Настройка Salt Mine для сбора данных:

# /srv/salt/minion mine_functions:   network.ip_addrs: []

Настройка Beacons для мониторинга состояния сервера:

# /srv/salt/beacons.conf beacons:   service:     - services:         nginx: {}     - interval: 10

Настройка Reactors для автоматического реагирования на события:

# /srv/salt/reactor/reactor.conf reactor:   - 'salt/beacon/*/service/':     - /srv/salt/reactor/service_restart.sls

Пример Reactor SLS файла для перезапуска сервиса:

# /srv/salt/reactor/service_restart.sls restart_service:   local.cmd.run:     - tgt: 'web*'     - arg:       - systemctl restart nginx     - require:       - beacon: salt/beacon/*/service/

Больше практических навыков по инфраструктуре вы можете получить в рамках практических онлайн-курсов от экспертов отрасли.


ссылка на оригинал статьи https://habr.com/ru/articles/825670/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *