Ist es möglich, eine systemd-Einheitendatei zu überschreiben, um eine Vorlageneinheitendatei zu erstellen?

8

Ich weiß, dass systemd einen hervorragenden Mechanismus zum Überschreiben einer vom Paket bereitgestellten Einheitendatei bietet, um die Dienstkonfiguration / das Dienstverhalten zu beeinflussen. Dies erfolgt normalerweise mit dem folgenden Befehl

sudo systemctl edit <unitfile>

um eine überschreibende conf-Datei unter zu erstellen

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

Systemd bietet auch einen separaten Mechanismus zum Definieren einer Vorlageneinheitendatei und zum Instanziieren, um zur Laufzeit instanzspezifische Einheiten zu erstellen. Dies erfordert die Benennung der Vorlagendatei als

<servicename>@.service

und dann instanziieren als

systemctl start <servicename>@<instancename>

Jetzt habe ich eine Situation, in der ich einen vom Paket bereitgestellten Dienst als Instanzen mit mehreren Einheiten ausführen möchte. Ich möchte vermeiden, eine eigene Vorlageneinheitendatei zu erstellen. Daher versuche ich zu prüfen, ob die vom Paket bereitgestellte Einheitendatei überschrieben werden kann, um die Vorlageneinheitendatei zu erstellen.

Da die Vorlageneinheitendatei meines Wissens eine andere Namenskonvention aufweist als die reguläre Einheitendatei, kann ich die vom Paket bereitgestellte Einheitendatei meiner Meinung nach nicht durch eine Vorlagendatei überschreiben, indem ich sie in / etc / systemd / system platziere.

Gibt es einen definierten Weg, um das zu erreichen, was ich versuche?

Spezifisches Szenario: Das grafana-Paket installiert eine Einheitendatei grafana-server.service. Ich möchte zwei Instanzen von Grafana auf meinem Computer ausführen - jeweils eine für DEV und STG. Ich konnte dies tun:

  • Ändern Sie die Datei grafana-server.service (verwenden Sie% I, um Ordnerpositionen und Dateipfade festzulegen).
  • Benennen Sie den geänderten grafana-server.service in grafana-server @ .service um
  • Starten Sie Instanzen von Grafana mit:

    sudo systemctl start grafana-server@dev
    

    und

    sudo systemctl start grafana-server@stg
    

Dadurch wird jedoch die Verknüpfung mit der von grafana bereitgestellten Service Unit-Datei unterbrochen. Wenn die Service-Datei beim Upgrade erweitert wird, muss diese Aktivität erneut ausgeführt werden. Mein Ziel ist es, diese direkte Abhängigkeit zu vermeiden und sie stattdessen in eine Überschreibungsabhängigkeit umzuwandeln.

Irgendwelche Gedanken?

sujitv
quelle

Antworten:

6

Für beide Optionen unten überschreiben Sie zuerst den grafana-server.service (ohne das @) /etc/systemd/systemund unterdrücken ExecStart(vorausgesetzt, er verwendet das), damit nichts gestartet wird . Am /etc/systemd/system/grafana-server.service.d/10-disable-execstart.conf:

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

Option 1 - Überschreiben mit generischen Instanzen

Erstellen Sie eine [email protected], die Ihren Einstellungen entspricht, mit der folgenden Konfiguration für [Unit]und [Service]:

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

Diese sollten den Start / Stopp / Neustart von grafana-server an alle Ihre Instanzen zusammenbinden. Die Magie ist nicht sehr gut dokumentiert, aber wenn Sie <instance_name>.confDateien auf Ihre legen /path/to/your/confdir, werden alle diese Instanzen automatisch gebunden!

Option 2 - Überschreiben bestimmter Instanzen, um die Paketkonfiguration beizubehalten

Wenn Sie alle Aktualisierungsfunktionen aus der Paketdienstdatei beibehalten möchten , aber die Beibehaltung der Optionen für benutzerdefinierte Instanzen akzeptieren möchten, erstellen Sie einen symbolischen Link für jeden Instanznamen von generic

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

zu

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

und überschreiben Sie dann nur die spezifischen Optionen dieser Instanz mit

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

Achten Sie darauf , die folgende Konfiguration hinzuzufügen [Unit]und [Service]zu 99-my-options.conf:

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

Dies setzt für jede Instanz alle grafana-server.serviceOptionen voraus und überschreibt sie mit allen Optionen in der 99-my-options.confDatei. Außerdem werden Start- / Stopp- / Neustartaktionen an grafana-server.service gebunden.

Bei beiden Optionen, wenn Sie ausführen

systemctl start grafana-server.service

Alle Ihre Instanzen, die eine /path/to/confdir/<instance>.confDatei haben, werden gestartet. Gleiches gilt für stopund restartUND Sie können sie jederzeit einzeln verwalten, indem Sie ihren grafana-server@<instance>Servicenamen verwenden.

RDP
quelle