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

8

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

sudo systemctl edit <unitfile>

создать файл переопределения conf в

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

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

<servicename>@.service

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

systemctl start <servicename>@<instancename>

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

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

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

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

  • изменить файл grafana-server.service (используя% I для установки местоположения папок и путей к файлам)
  • переименуйте измененный grafana-server.service в grafana-server @ .service
  • начать экземпляры графана с помощью:

    sudo systemctl start grafana-server@dev
    

    а также

    sudo systemctl start grafana-server@stg
    

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

Какие-нибудь мысли?

sujitv
источник

Ответы:

6

Для обоих приведенных ниже вариантов сначала переопределите 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

Это должно связать запуск / остановку / перезапуск grafana-сервера со всеми вашими экземплярами вместе. Магия не очень хорошо документирована, но если поместить <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файле, а также свяжет действия start / stop / restart с grafana-server.service.

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

systemctl start grafana-server.service

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

RDP
источник