Wie lade ich eine Gruppe von systemd-Diensten neu?

11

Ich möchte eine Gruppe von Diensten bei einem Ereignis neu laden (nicht neu starten!).

Wenn ich beispielsweise meine SSL-Zertifikate aktualisiere, möchte ich, dass jeder Dienst, der sie verwendet, neu geladen wird ( nginxund postfixmir in den Sinn kommt). Ich möchte mich auch nicht daran erinnern, welche Dienste auf einem bestimmten Server SSL-Zertifikate verwenden. Es sollte ausreichen, sie bei der Konfiguration zu gruppieren.

Auf der anderen Seite möchte ich vermeiden, .servicedie mit den Paketen gelieferten Dateien zu ändern , da dies manuelle Eingriffe während der Aktualisierungen erfordert.

Wie schaffe ich das?

Es besteht die Möglichkeit, eine Gruppe von Diensten auf Anfrage zu stoppen. Dies würde sie jedoch für ein oder zwei Sekunden oder noch schlimmer unzugänglich machen. Sie bleiben möglicherweise bis zur Behebung inaktiv. Das kann ich mir nicht leisten.

Sanmai
quelle
Ich bin nicht sicher, wie Sie Zertifikate bereitstellen, aber hier ist auch ein Pre-Hook und Post-Hook für die meisten automatischen Erneuerungen /opt/letsencrypt/letsencrypt-auto renew --pre-hook "service nginx stop; service postfix stop; service squid stop" --post-hook "service nginx start; service postfix start; service squid start" : certmonger hat Postsave- und Presave-Befehle
Jacob Evans
@JacobEvans Das benutze ich! Früher gab es ein Problem in einem Konfigurationsdatei-Parser für certbot: Es wurden keine Semikolons zugelassen. Daher mussten Sie ein Befehlszeilenargument verwenden oder es auf einmal ausführen. Im Moment ist das alles unnötig.
Sanmai
Wenn Sie Ihre .serviceDatei als Überschreibungen bearbeiten , können Sie das Aktualisierungsproblem vermeiden. sudo systemctl edit foo.servicespeichert Ihre Änderungen in /etc/systemd/system/foo.service.d/override.confder installierten foo.serviceDatei, anstatt sie zu ändern .
Quixotic

Antworten:

20

Erstellen Sie /etc/systemd/system/ssl-reload.targetmit den folgenden Inhalten.

[Unit]
Description=Services which need reloaded with SSL certs are updated.
PropagatesReloadTo=nginx postfix

Dann erstellen Sie eine weitere Datei: /etc/systemd/system/ssl-reload.path

[Unit]
Description=Restart services which use SSL when the cert directory changes

[Path]
PathChanged=/path/to/your/ssl/certs/dir

[Install]
WantedBy=multi-user.target

Dann:

systemctl enable ssl-reload.path
systemctl start ssl-reload.path

Nachdem dies in Ihrem SSL-Verzeichnis geändert wurde, sollten die gewünschten Dienste automatisch neu geladen werden.

Wenn Sie das automatische Verhalten nicht möchten, verwenden Sie die .pathDatei nicht und geben Sie sie nur systemctl reload ssl-reload.targetmanuell aus, nachdem Sie die SSL-Dateien geändert haben.

Mark Stosberg
quelle