Гид по технологиям

Как управлять серверами с помощью Rex — лучшие практики

4 min read DevOps Обновлено 16 Nov 2025
Управление серверами с Rex — лучшие практики
Управление серверами с Rex — лучшие практики

О чём эта инструкция

Rex — это инструмент для оркестрации и управления конфигурацией серверов. С помощью Rex вы управляете всеми машинами из центральной точки и автоматизируете процесс конфигурации и развертывания ПО.

Проще говоря, Rex похож на Make. Существует центральный Rexfile, в котором вы определяете задачи. Эти задачи выполняются на удалённых машинах по SSH. Задачи пишутся на обычном Perl.

Официальный сайт проекта: http://rexify.org/.

Важно: в примерах ниже автор использует Subversion для хранения кода. Вы можете использовать любую другую систему контроля версий с поддержкой эквивалентной директивы externals.

Предпосылки

  • Сервер Subversion (назовём его svn01)
  • Сервер базы данных (db01)
  • Веб-сервер (web01)
  • Рабочая станция разработчика/операций (wks01)
  • Примеры показаны на Ubuntu 12.04, но подойдут и другие дистрибутивы
  • Используйте sudo там, где это требуется

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

Настройка репозиториев кода

Установите необходимые пакеты на Subversion-сервере:

svn01# apt-get install libapache2-svn subversion apache2-mpm-prefork

Отредактируйте файл /etc/apache2/mods-enabled/dav_svn.conf и вставьте (заменив существующее содержимое):


  DAV svn
  SVNParentPath /var/lib/svn
  AuthType Basic
  AuthName "Subversion Repository"
  AuthUserFile /etc/apache2/dav_svn.passwd
  
    Require valid-user
  

Создайте каталог репозиториев и сами репозитории:

svn01# mkdir /var/lib/svn  
svn01# cd /var/lib/svn  
svn01 /var/lib/svn# svnadmin create common  
svn01 /var/lib/svn# svnadmin create service  
svn01 /var/lib/svn# svnadmin create database  
svn01 /var/lib/svn# svnadmin create website  
svn01 /var/lib/svn# chown -R www-data: .

Настройте аутентификацию Apache:

svn01# htpasswd -c /etc/apache2/dav_svn.passwd your-user-name

Перезапустите Apache:

svn01# service apache2 restart

Теперь сервер Subversion готов. Перейдём на рабочую станцию.

Checkout репозиториев на рабочей станции

На рабочей станции выполните:

wks01# svn co http://svn01/svn/common Common  
wks01# svn co http://svn01/svn/service Service  
wks01# svn co http://svn01/svn/database  
wks01# svn co http://svn01/svn/website

Написание задач (модулей)

Сначала добавим общую задачу для настройки NTP. Перейдите в директорию Common и создайте файл NTP.pm.

wks01# cd Common
# Common/NTP.pm
package Common::NTP;
use Rex -base;
task prepare => sub {
   install "ntp";
   file "/etc/ntp.conf",
      source => "files/ntp.conf",
      on_change => sub {
         service ntp => "restart";
      };
};
1;

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

Создайте каталог для файлов и добавьте ntp.conf:

bash Common# mkdir files

Содержимое files/ntp.conf (простой default-файл):

# /etc/ntp.conf, managed with rex
driftfile /var/lib/ntp/ntp.drift
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable
server 0.ubuntu.pool.ntp.org
server 1.ubuntu.pool.ntp.org
server 2.ubuntu.pool.ntp.org
server 3.ubuntu.pool.ntp.org
# Use Ubuntu's ntp server as a fallback.
server ntp.ubuntu.com
restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery
# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1

Добавьте файлы в репозиторий и закоммитьте:

wks01 Common# svn add NTP.pm files  
wks01 Common# svn ci -m "added NTP task"

Модули service: Apache и MySQL

Перейдите в репозиторий Service и создайте модули Apache и MySQL.

wks01 Common# cd ../Service  
wks01 Service# touch Apache.pm MySQL.pm

Apache.pm:

package Service::Apache;
use Rex -base;
task prepare => sub {
   install "apache2";
};
task configure => sub {
   my $param = shift;
   file "/etc/apache2/apache2.conf",
      owner => "root",
      mode => 644,
      content => template("templates/apache2/apache2.conf.tpl", %{ $param });
   file "/etc/apache2/conf.d/security",
      owner => "root",
      mode => 644,
      content => template("templates/apache2/conf.d/security.tpl", %{ $param });
};
1;

Создайте шаблоны:

wks01 Service# mkdir -p templates/apache2/conf.d

Содержимое templates/apache2/apache2.conf.tpl (комментарии опущены):

LockFile /var/run/apache2/accept.lock
PidFile /var/run/apache2.pid
Timeout <%= is_defined($::timeout, "300") %>
KeepAlive <%= is_defined($::keepalive, "On") %>
MaxKeepAliveRequests <%= is_defined($::max_keepalive_requests, "100") %>
KeepAliveTimeout <%= is_defined($::keepalive_timeout, "5") %>

    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0


    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      75 
    ThreadLimit          64
    ThreadsPerChild      25
    MaxClients          150
    MaxRequestsPerChild   0


    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      75 
    ThreadLimit          64
    ThreadsPerChild      25
    MaxClients          150
    MaxRequestsPerChild   0

User <%= is_defined($::user, "www-data") %>
Group <%= is_defined($::group, "www-data") %>

AccessFileName .htaccess

    Order allow,deny
    Deny from all
    Satisfy all

DefaultType None

HostnameLookups <%= is_defined($::hostname_lookups, "Off") %>
ErrorLog <%= is_defined($::error_log, "/var/log/apache2/error.log") %>
LogLevel <%= is_defined($::log_level, "warn") %>
Include mods-enabled/*.load
Include mods-enabled/*.conf
Include httpd.conf
Include ports.conf
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

Include conf.d/
Include sites-enabled/

Содержимое templates/apache2/conf.d/security.tpl:

ServerTokens <%= is_defined($::server_tokens, "Prod") %>
ServerSignature <%= is_defined($::server_signature, "Off") %>
TraceEnable <%= is_defined($::trace_enable, "Off") %>

MySQL модуль (MySQL.pm):

package Service::MySQL;
use Rex -base;
task prepare => sub {
   install "mysql-server";
};
task configure => sub {
   my $param = shift;
   file "/etc/mysql/my.cnf",
      owner => "root",
      mode => 644,
      content => template("templates/mysql/my.cnf.tpl", %{ $param });
};
1;

Шаблон templates/mysql/my.cnf.tpl:

[mysqld]
user     = <%= is_defined($::user, "mysql") %>
pid-file = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
port     = <%= is_defined($::port, "3306") %>
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
lc-messages-dir   = /usr/share/mysql
skip-external-locking
bind-address      = <%= $::eth0_ip %>
key_buffer     = <%= is_defined($::key_buffer, "16M") %>
max_allowed_packet   = <%= is_defined($::max_allowed_packet, "16M") %>
thread_stack      = <%= is_defined($::thread_stack, "192K") %>
thread_cache_size       = <%= is_defined($::thread_cache_size, "8") %>
myisam-recover         = BACKUP
query_cache_limit = <%= is_defined($::query_cache_limit, "1M") %>
query_cache_size        = <%= is_defined($::query_cache_size, "16M") %>
expire_logs_days  = <%= is_defined($::expire_logs_days, "10") %>
max_binlog_size         = <%= is_defined($::max_binlog_size, "100M") %>

[mysqldump]
quick
quote-names
max_allowed_packet   = <%= is_defined($::max_allowed_packet, "16M") %>
[mysql]
[isamchk]
key_buffer     = <%= is_defined($::key_buffer, "16M") %>
!includedir /etc/mysql/conf.d/

Добавьте и закоммитьте файлы:

wks01 Service# svn add *  
wks01 Service# svn ci -m "inital commit of apache and mysql service"

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

Практические рекомендации и шаблон работы

  • Версионируйте все модули и шаблоны. Это упрощает откат и аудит.
  • Делите код по неймспейсам (Common::, Service::, Project::). Это улучшает ответственность и тестируемость.
  • Пишите idempotent-задачи: повторное выполнение не должно ломать систему.
  • Используйте шаблоны с параметрами (template + is_defined) для удобства конфигурирования в разных окружениях.

Мини-методология работы:

  1. Создайте/обновите модуль на рабочей станции.
  2. Закоммитьте в SCM.
  3. Проверяйте синтаксис и шаблоны локально (если возможно).
  4. Выполните задачу на тестовом сервере через Rex.
  5. Примените на продакшн после проверки.

Контрольный список ролей (операции / DBA / devops)

  • Операции:
    • Поддерживать общий репозиторий Common.
    • Обеспечивать доступы и CI (если есть).
  • DBA:
    • Поддерживать шаблон my.cnf и параметры производительности.
    • Тестировать откаты и бэкапы перед применением.
  • DevOps/Инженеры приложений:
    • Подключать модуль Service::Apache и адаптировать шаблоны под приложение.
    • Проверять логи после развёртывания.

Когда подход с Rex не подойдёт

  • Если у вас огромная распределённая инфраструктура с тысячами нод, возможно лучше подходят инструменты с контроллерами и масштабируемой архитектурой (например, Terraform/Orchestration с агентами). Rex отлично подходит для небольших и средних сред, где достаточно SSH.
  • Если нужна сложная декларативная модель и богатая экосистема модулей, стоит рассмотреть Ansible или Salt.

Альтернативы и краткое сравнение

  • Ansible — agentless, YAML-плейбуки, богатая экосистема ролей.
  • Puppet/Chef — более тяжёлые, ориентированы на декларативную модель и масштаб.
  • Salt — гибридный, поддерживает агентную и безагентную работу.

Rex хорош, когда вы хотите простую, скриптовую модель на Perl и лёгкую интеграцию через SSH.

Безопасность и рекомендации по доступу

  • Ограничьте доступ к Subversion и Rexfile только доверенным пользователям.
  • Храните секреты отдельно (vault, environment variables, зашифрованные шаблоны), а не в репозитории в открытом виде.
  • Используйте ключи SSH с passphrase и agent-forwarding по необходимости.

Критерии приёмки

  • Модуль запускается без ошибок на тестовой ноде.
  • Конфигурационные файлы соответствуют шаблону и параметрам окружения.
  • Службы корректно перезапускаются при изменениях.
  • При повторном выполнении задачи состояние не меняется (идемпотентность).

Краткое резюме

  • Rex — удобный инструмент для управления конфигурацией через SSH.
  • Разделяйте общие и проектные задачи в разных репозиториях.
  • Версионируйте шаблоны и используйте параметры для гибкости.
  • Тестируйте изменения на изолированных серверах перед продакшном.

Важно: этот пример даёт базовую структуру. Для боевого использования расширяйте проверки, добавляйте тесты и автоматизируйте CI/CD, чтобы изменения в Rex-модулях проходили проверку перед применением.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро