Назад | Перейти на главную страницу

Можно ли переопределить файл модуля systemd для создания файла модуля шаблона?

Я знаю, что systemd предоставляет отличный механизм для переопределения файла модуля, предоставленного пакетом, чтобы повлиять на конфигурацию / поведение службы. Обычно это делается с помощью следующей команды

sudo systemctl edit <unitfile>

для создания файла конфигурации переопределения в

/etc/systemd/system/<unitfile.d>/

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

<servicename>@.service

а затем создав его как

systemctl start <servicename>@<instancename>

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

Поскольку, насколько я понимаю, у файла модуля шаблона есть соглашение об именах, которое отличается от обычного файла модуля, я думаю, что я не могу переопределить предоставленный пакетом файл модуля файлом шаблона, поместив его в / etc / systemd / system.

Есть ли какой-нибудь определенный способ достичь того, что я пытаюсь сделать?

Конкретный сценарий: пакет grafana устанавливает единичный файл grafana-server.service. Я хочу запустить на моей машине два экземпляра графаны - по одному для DEV и STG. Мне удалось это сделать:

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

Есть предположения?

Для обоих вариантов ниже сначала переопределите grafana-server.service (без @) на /etc/systemd/system и подавить ExecStart (предположим, он использует это), чтобы ничего не запускать. На /etc/systemd/system/grafana-server.service.d/10-disable-execstart.conf:

[Service]
ExecStart=
WorkingDirectory=/path/to/your/confdir

Вариант 1. Переопределение универсальными экземплярами

Создать grafana-server@.service который соответствует вашим настройкам со следующей конфигурацией для [Unit] и [Service]:

[Unit]
PartOf=grafana-server.service
ReloadPropagatedFrom=grafana-server.service

Они должны связать запуск / остановку / перезапуск графана-сервера со всеми вашими экземплярами вместе. В магия не очень хорошо документирован, но если вы положите <instance_name>.conf файлы на вашем /path/to/your/confdir, все эти экземпляры будут связаны автоматически!

Вариант 2 - переопределение определенных экземпляров для сохранения конфигурации пакета

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

/lib/systemd/system/grafana-server.service

к

/etc/systemd/system/grafana-service@<instance>.service

а затем переопределить только определенные параметры этого экземпляра, используя

/etc/systemd/system/grafana-server@<instance>.service.d/99-my-options.conf

Обязательно добавьте следующую конфигурацию в [Unit] и [Service] к 99-my-options.conf:

[Unit]
PartOf=grafana-server.service
ReloadPropagatedFrom=grafana-server.service

Это будет предполагать для каждого экземпляра все grafana-server.service параметры и переопределит их со всеми параметрами на 99-my-options.conf file, а также привязать действия start / stop / restart к grafana-server.service.

В обоих вариантах, если вы запустите

systemctl start grafana-server.service

все ваши экземпляры, у которых есть /path/to/confdir/<instance>.conf файл будет запущен. То же самое относится к stop и restart И вы всегда можете управлять ими индивидуально, используя их grafana-server@<instance> наименование услуги.