Est-il possible de remplacer un fichier d'unité systemd pour créer un fichier d'unité modèle?

8

Je sais que systemd fournit un excellent mécanisme pour remplacer un fichier d'unité fourni par le package pour influencer la configuration / le comportement du service. Cela se fait généralement en utilisant la commande ci-dessous

sudo systemctl edit <unitfile>

pour créer un fichier de configuration de remplacement à

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

Systemd fournit également un mécanisme distinct pour définir un fichier d'unité modèle et le faire instancier pour créer des unités spécifiques à l'instance lors de l'exécution. Cela nécessite de nommer le fichier modèle comme

<servicename>@.service

puis l'instancier comme

systemctl start <servicename>@<instancename>

Maintenant, j'ai une situation où je voudrais exécuter un service fourni par package comme plusieurs instances d'unité. Je veux éviter de créer mon propre fichier d'unité de modèle, donc j'essaie de voir si le fichier d'unité fourni par le package peut être remplacé pour créer le fichier d'unité de modèle.

Étant donné que, à ma connaissance, le fichier d'unité de modèle a une convention de dénomination différente du fichier d'unité standard, je pense que je ne peux pas remplacer le fichier d'unité fourni par le package par un fichier de modèle en le plaçant dans / etc / systemd / system.

Existe-t-il un moyen défini de réaliser ce que j'essaie de faire?

Scénario spécifique: le package grafana installe un fichier d'unité grafana-server.service. Je veux exécuter deux instances de grafana sur ma machine - une pour DEV et STG chacune. J'ai pu le faire:

  • modifier le fichier grafana-server.service (en utilisant% I pour définir les emplacements des dossiers et les chemins d'accès aux fichiers)
  • renommer le grafana-server.service modifié en grafana-server @ .service
  • démarrer des instances de grafana en utilisant:

    sudo systemctl start grafana-server@dev
    

    et

    sudo systemctl start grafana-server@stg
    

Cependant, cela rompt le lien avec le fichier d'unité de service fourni par grafana et s'ils améliorent le fichier de service lors de la mise à niveau, je devrai refaire cette activité. Mon objectif est d'éviter cette dépendance directe et de la convertir à la place en une dépendance de substitution.

Des pensées?

sujitv
la source

Réponses:

6

Pour les deux options ci-dessous, remplacez d'abord grafana-server.service (sans le @) /etc/systemd/systemet supprimez ExecStart(en supposant qu'il l'utilise) pour qu'il ne démarre rien. Le /etc/systemd/system/grafana-server.service.d/10-disable-execstart.conf:

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

Option 1 - Remplacement des instances génériques

Créez un [email protected]qui correspond à vos paramètres avec la configuration suivante vers [Unit]et [Service]:

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

Ceux-ci doivent lier le démarrage / l'arrêt / le redémarrage du serveur grafana à toutes vos instances. La magie n'est pas très bien documentée, mais si vous mettez des <instance_name>.conffichiers sur vous /path/to/your/confdir, toutes ces instances seront liées automatiquement.

Option 2 - Remplacer des instances spécifiques pour conserver la configuration du package

Si vous souhaitez conserver toutes les qualités de mise à jour du fichier de service de package, mais acceptez les options de conservation des instances personnalisées, créez un lien symbolique pour chaque nom d'instance à partir de générique

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

à

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

puis remplacer uniquement les options spécifiques de cette instance en utilisant

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

Assurez-vous d'ajouter la configuration suivante à [Unit]et [Service]à 99-my-options.conf:

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

Cela supposera pour chaque instance toutes les grafana-server.serviceoptions et les remplacera avec toutes les options du 99-my-options.conffichier et liera également les actions de démarrage / arrêt / redémarrage à grafana-server.service.

Sur les deux options, si vous exécutez

systemctl start grafana-server.service

toutes vos instances qui ont un /path/to/confdir/<instance>.conffichier seront démarrées. La même chose s'appliquent à stopet restartet vous pouvez toujours les gérer individuellement en utilisant leur grafana-server@<instance>nom de service.

RDP
la source