Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

systemd: шаблоны в юнит-файлах

Оригинал: systemd: Template unit files
Автор: Chaoyi Zha
Дата публикации: 9 декабря 2015 г.
Перевод: А.Панин
Дата перевода: 24 января 2016 г.

systemd: шаблоны в юнит-файлах

И снова добро пожаловать в серию статей о возможностях менеджера инициализации systemd. Как вы наверняка узнали из предыдущих статей серии, в systemd реализован мощный и гибкий механизм запуска и управления состояниями системных служб. Некоторые из рассмотренных возможностей systemd были введены для достижения совместимости с устаревшей системой инициализации SysVinit. Однако, шаблоны в юнит-файлах systemd не имеют аналогов.

Что за шаблоны в юнит-файлах?

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

<имя_службы>@<аргумент>.service

Аргумент является фрагментом текста (строкой), который передается systemd для использования в рамках юнит-файла. Этот аргумент может использоваться для описания способа работы systemd с определенным экземпляром юнита. Множество экземпляров одного и того же юнита может существовать одновременно.

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

  • Идентификатор %i позволяет осуществлять передачу аргумента, который будет особым образом отформатирован (из него будут убраны все спецсимволы)
  • Идентификатор %I позволяет осуществить передачу аргумента без какой-либо обработки.

Удаление спецсимволов из идентификатора перед его использованием осуществляется в соответствии со специальными правилами. При этом заменяются все символы, которые не могут использоваться в именах файлов.

Реальные примеры использования

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

[Unit]
Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I
After=network.target

[Service]
PrivateTmp=true
Type=forking
PIDFile=/var/run/openvpn/%i.pid
ExecStart=/usr/sbin/openvpn --daemon --writepid /var/run/openvpn/%i.pid --cd /etc/openvpn/ --config %i.conf

[Install]
WantedBy=multi-user.target

Как видите, идентификатор для передачи аргументов без спецсимволов %i используется везде, где осуществляется передача имен файлов. Идентификатор для передачи аргументов без предварительной обработки %I используется лишь в описании, спецсимволы в составе которого могут повысить читаемость.

Данный юнит-файл позволяет использовать имя службы openvpn@myconfig.service для запуска экземпляра юнита openvpn, который будет использовать файл конфигурации с именем myconfig. В этом случае демону OpenVPN будет передаваться путь к файлу конфигурации /etc/openvpn/myconfig.conf. Кроме того, идентификатор процесса демона будет записываться в файл /var/run/openvpn/myconfig.pid.

Другим примером является текстовый терминал в любой системе Fedora. Каждый раз при использовании сочетания клавиш Ctrl+Alt+F2, Ctrl+Alt+F3 и.т.д. для переключения консолей в ней открывается новый терминал. В этом случае systemd обращается к системной службе getty@.service. При этом systemd осуществляет поиск юнит-файла getty.service и передает ему соответствующий аргумент, такой, как tty2, tty3. Идентификатор %i позволяет передавать аргумент, благодаря которому терминал открывается в новой консоли.

Пример шаблона

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

# fancy-web-server.service
[Unit]
Description=My HTTP server
AssertPathExists=/srv/webserver

[Service]
Type=notify
ExecStart=/usr/sbin/some-fancy-httpd-server %i.conf
Nice=5

[Install]
WantedBy=multi-user.target

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

$ sudo systemctl start fancy-web-server@config1.service
$ sudo systemctl start fancy-web-server@config2.service

В результате будут запущены два экземпляра веб-сервера fancy-http-server с использованием следующих команд:

/usr/sbin/some-fancy-httpd-server config1.conf
/usr/sbin/some-fancy-httpd-server config2.conf

Строки config1 и config2 взяты из аргументов команд sytemd и подставлены вместо идентификаторов %i в юнит-файле.

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

Дополнительное чтение

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