Ich fand diese Systemd-Service-Datei, um autossh zu starten und einen SSH-Tunnel aufrechtzuerhalten: https://gist.github.com/thomasfr/9707568
[Unit]
Description=Keeps a tunnel to 'remote.example.com' open
After=network.target
[Service]
User=autossh
# -p [PORT]
# -l [user]
# -M 0 --> no monitoring
# -N Just open the connection and do nothing (not interactive)
# LOCALPORT:IP_ON_EXAMPLE_COM:PORT_ON_EXAMPLE_COM
ExecStart=/usr/bin/autossh -M 0 -N -q -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -p 22 -l autossh remote.example.com -L 7474:127.0.0.1:7474 -i /home/autossh/.ssh/id_rsa
[Install]
WantedBy=multi-user.target
Gibt es eine Möglichkeit, systemd so zu konfigurieren, dass mehrere Tunnel in einem Dienst gestartet werden?
Ich möchte keine N Systemdienstdateien erstellen, da ich das Kopieren und Einfügen vermeiden möchte.
Alle Servicedateien wären identisch, außer dass "remote.example.com" durch andere Hostnamen ersetzt würde.
1,5 Jahre später ...
Ich habe diese Frage vor ungefähr 1,5 Jahren gestellt.
Meine Meinung hat sich ein bisschen geändert. Ja, es ist schön, dass Sie dies mit systemd tun können (ich benutze es immer noch), aber ich werde in Zukunft das Konfigurationsmanagement verwenden.
Warum sollte systemd eine Vorlagensprache implementieren und% h ersetzen?
Einige Monate später denke ich, dass diese Schleife und das Templating mit einem Tool gelöst werden sollten, das die Konfiguration automatisiert. Ich benutze jetzt ein Tool dieser Liste bei Wikipedia .
Antworten:
Angenommen, das Einzige, was sich pro Einheitsdatei ändert, ist das
remote.example.com
Teil, dann können Sie einen instanziierten Dienst verwenden .Von der
systemd.unit
Manpage:Grundsätzlich erstellen Sie eine einzelne Unit-Datei, die (normalerweise
%i
) eine Variable enthält, in der die Unterschiede auftreten, und die dann verknüpft wird, wenn Sie diesen Dienst "aktivieren".Zum Beispiel habe ich eine Unit-Datei
/etc/systemd/system/[email protected]
, die so aussieht:Was ich dann aktiviert habe
Und kann mit interagieren
Wie Sie sehen, werden alle Instanzen
%i
in der Unit-Datei durch ersetztsomehost.example.com
.Es gibt zwar eine Menge weiterer Spezifizierer , die Sie in einer Unit-Datei verwenden können, aber ich finde
%i
, dass sie in solchen Fällen am besten funktionieren.quelle
enable
Aktion, dass eine Einheit / ein Dienst beim Booten gestartet wird.Hier ist ein Python-Beispiel, nach dem ich gesucht habe. Mit
@
dem Dateinamen im Dienst können Sie N Prozesse starten:Verschiedene Methoden, um es aufzurufen
Verschiedene Zählungen aktivieren, zum Beispiel:
Erlaube 30 Arbeiter:
2 Arbeiter aktivieren:
Stellen Sie dann sicher, dass Sie Folgendes neu laden:
Jetzt können Sie dann auf verschiedene Arten starten / stoppen:
Start 1:
Mehrere starten:
Mehrere stoppen:
Status überprüfen:
UPDATE : Um Instanzen als einen Dienst zu verwalten, können Sie folgendermaßen vorgehen:
/etc/systemd/system/[email protected]:
/usr/bin/some-worker-start.sh:
/etc/systemd/system/some-worker.service:
Und jetzt können Sie alle Instanzen mit verwalten
sudo systemctl some-worker (start|restart|stop)
Hier ist ein Kesselschild für Ihre
script.py
:quelle
systemctl some-worker (start|restart|stop)
wissen Sie, an welchen Instanzen Sie arbeiten müssen?Now you can start/stop then in various ways
.GregLs Antwort hat mir sehr geholfen. Hier ist ein Beispiel für eine Einheitenvorlage, die ich in meinem Code anhand des obigen Beispiels für einen Gearman-Jobserver verwendet habe. Ich habe ein Shell-Skript erstellt, mit dem ich mithilfe dieser einen Vorlage eine Menge "Worker" erstellen kann.
quelle