Linux & Co.

Viele (Linux-)Rechner gleichzeitig administrieren

Ein und denselben Befehl mehrmals eingeben? Nope, gefällt mir nicht ;)

Auch in Nicht-Techie-Netzwerken tummeln sich schnell mal ein paar virtuelle Maschinen, NAS-Geräte, Mediaserver und Bastelrechner wie Raspberry Pies. Wenn Ihr nun alle Rechner aktualisieren, überall ein bestimmtes Programm installieren oder sie anderweitig administrieren wollt, kann das etwas dauern mit den vielen Anmeldungen und der Tipperei. Aber es geht auch anders, mit Standard-Tools (es muss ja nicht immer Ansible sein).

Administrieren mit SSH + Skript

Zum Setup: Bei den entfernten Rechnern im Netz, den Hosts, handelt es sich im Wesentlichen um Linux-Rechner – was bei virtuellen Maschinen und Raspis der Regelfall ist. Natürlich ließen sich auch Windows-Rechner mit dem hier vorgestellten Prozedere fernbedienen, aber das macht schlicht keinen Spaß. Weder gibt es standardmäßig SSH-Zugang, noch kann man in einer SSH-Session mal eben zum Windows-Admin werden, um überhaupt die nötigen Rechte zu bekommen. Zum Absenden der Befehle kann aber freilich Windows genutzt werden, beispielsweise über die Bash aus dem Git-for-Windows-Paket.

Das eigentliche Vorgehen: Zunächst wird für passwortlosen SSH-Zugang des Kontrollrechners zu den Hosts gesorgt – und für passwortloses „sudo apt“. Dann verbindet sich ein Skript mit den Hosts und führt auf jedem beliebige Befehle aus. Im Grunde ist das auch die Arbeitsweise der professionellen Verwaltungssoftware Ansible, nur, dass Ansible über Tausende interner Funktionen verfügt, die eigene Skripte oft überflüssig machen und dazu jede Menge Abstraktionsebenen ermöglicht. (Ansible selbst erkläre ich bei Dev-Insider.de näher.)

SSH-Zugang und sudo ohne Passwörter

Normalerweise müsst Ihr bei der Anmeldung via SSH ein Passwort eingeben – Skripte sollen aber natürlich ohne menschliche Interaktion ablaufen. Alternativ könnt Ihr auf dem Host schlicht den öffentlichen Schlüssel eines Schlüssel-Paars hinterlegen. Im Grunde dient dieser öffentliche Schlüssel auf dem entfernten Rechner eher als Schlüsselloch – und zwar für den privaten Schlüssel des Schlüssel-Paars, der auf dem Kontrollrechner verbleibt.

Erstellt also zunächst ein Schlüssel-Paar auf dem Kontrollrechner:

ssh-keygen

Die Frage nach einem zu setzenden Passwort bestätigt Ihr einfach mit Enter, schließlich ist kein Passwort gewünscht. Der öffentliche Schlüssel landet in der Datei ~/.ssh/id_rsa.pub (der private Schlüssel in id_rsa). Kopiert nun den Inhalt der id_rsa.pub, den Ihr per

cat ~/.ssh/id_rsa.pub

bekommt. Diesen fügt Ihr nun auf allen entfernten Hosts in folgende Datei ein:

~/.ssh/authorized_keys

Von Konten/Rechnern, die das private Gegenstück zu dem eingefügten Schlüssel haben, könnt Ihr Euch dann ohne Passwort anmelden. Die eigentliche Anmeldung bleibt identisch, also zum Beispiel:

ssh peter@192.168.178.300

Wenn der Nutzername auf Kontrollrechner und entferntem Host identisch ist, kann der natürlich ausgelassen werden.

Einmal angemeldet, soll der Nutzer natürlich auch Kommandos ausführen können, für die Admin-Rechte benötigt werden, also zum Beispiel das Installieren von Apps mit „sudo apt install“. Mitglied in der sudo-Gruppe ist man bei Ubuntu & Co. meist standardmäßig. Nun muss noch konfiguriert werden, dass Nutzer peter das Programm apt ohne Passwort nutzen darf.

Öffnet also die sudoers-Datei auf allen entfernten Hosts mit

sudo visudo

und fügt folgenden Inhalt am Ende ein:

peter ALL=(ALL:ALL) NOPASSWD: /usr/bin/apt

Heißt: Nutzer peter darf „/usr/bin/apt“ auf allen (ALL 1) Hosts wie beliebige Nutzer (ALL 2) und beliebige Gruppen (ALL 3) ohne Passwort ausführen. Sprich:

sudo apt install foobar

fragt nicht mehr nach einem Passwort.

Das Mini-Skript

Zunächst benötigt Ihr eine Liste mit Host samt Nutzernamen, hier in der Datei iplist:

ubuntu@192.168.178.200
peter@192.168.178.300

Das Verwaltungsskript hostmanager.sh sieht dann so aus:

#!/bin/sh
for ip in $(cat iplist); do
        ssh $ip "sudo apt -y install fortune"
done

Über eine simple for-Schleife (hier mehr zu Schleifen) wird sich hier nacheinander mit jedem Host verbunden und anschließend das sudo-apt-Kommando ausgeführt. Das Konzept ließe sich an dieser Stelle einfach erweitern: Mehrere Host-Inventare für unterschiedliche Aufgaben, die Aufgaben von Bedingungen abhängig machen, Berichte mit etwaigen Fehlermeldungen zurückgeben, ausgelagerte Variablen und Paketlisten, eine Bibliothek mit Funktionen für den Einsatz im mehreren Skripten … aber da nähert man sich dann ganz langsam Ansible und dieses Rad wurde schon erfunden.

Mehr, Sicherheit und Fazit

Statt nur ein einzelnes apt-Kommando könnt Ihr hier natürlich viel viel mehr ausführen lassen, zum Beispiel alle nötigen Befehle, um ein System zu aktualisieren. Und auch Windows-Hosts könntet Ihr aufnehmen, da wäre dann aber noch etwas mehr Vorarbeit auf den Hosts nötig. Aber das Grundgerüst ist schon ziemlich flexibel.

Hier also nochmal die Kurzform zum Merken:

  • Passwortlosen SSH-Zugang einrichten (Kontrollrechner und Hosts)
  • Passwortlose sudo-Befehle einrichten (Hosts)
  • Inventar der Hosts erstellen (Kontrollrechner)
  • Skript zur Abarbeitung von sudo-Befehlen auf allen Hosts im Inventar (Kontrollrechner)

Das Ganze ist einfach, flexibel und mit Standard-Tools umgesetzt. Aber es geht natürlich deutlich flexibler, sicherer, mächtiger: Das bereits erwähnte Ansible setzt ebenfalls auf passwortlose SSH-Zugänge und Host-Inventare, regelt die Rechte-Fragen aber selbständig und für Standards wie apt und sonstige Paketmanager gibt es interne Module. Aber: Ansible fügt dem Ganzen auch allerhand Overhead hinzu, so dass die manuelle Lösung für das kleine Heimnetzwerk vielleicht die bessere Lösung ist.

Tipp: Wenn Ihr eine solche Verwaltung vor allem für virtuelle Maschinen benötigt, kann ich Euch Multipass empfehlen – mehr dazu haben wir hier. Mit Multipass könnt Ihr per cloud-init-Konfigurationsdatei VMs mit einem Befehl erstellen, bei denen die SSH- und sudo-Konfigurationen bereits bei der Erstellung automatisch mit eingerichtet werden. Ihr könntet also problemlos und binnen kürzester Zeit 20 VMs aufsetzen und sie dann mit Euren Skripten verwalten.

Tipp 2: So sehr ich auch Umsetzungen mit Standard-Tools mag, für Nicht-Puristen lohnt es sich sicherlich, passende Tools zu installieren. Ansible bedeutet zwar rund einen Tag Einarbeitung, ist danach aber ein Traum! Oder etwas schlanker: Es gibt auch Apps wie Clusterssh, die speziell dafür da sind, mehrere Hosts gleichzeitig zu bedienen. Clusterssh öffnet schlicht SSH-Verbindungen zu mehreren Hosts gleichzeitig und führt Befehle dann entsprechend auf allen aus. Die Lösung liegt dann ungefähr zwischen meinem manuellen Ansatz und Ansible.

Mehr zum Thema Linux. Oder aber auch:

(* = Affiliate-Link / Bildquelle: Amazon-Partnerprogramm)

Einstiegsbild basiert auf: Gerd Altmann from Pixabay

Mirco Lang

Freier Journalist, Exil-Sauerländer, (ziemlich alter) Skateboarder, Dipl.-Inf.-Wirt, Einzelhandelskaufmann, Open-Source-Nerd, Checkmk-Handbuchschreiber. Ex-Saturn'ler, Ex-Data-Becker'ler, Ex-BSI'ler. Computer-Erstkontakt: ca. 1982 - der C64 des großen Bruders eines Freunds. Wenn Ihr hier mehr über Open Source, Linux und Bastelkram lesen und Tutonaut unterstützen möchtet: Über Kaffeesponsoring via Paypal.freue ich mich immer. Schon mal im Voraus: Danke! Nicht verpassen: cli.help und VoltAmpereWatt.de. Neu: Mastodon

3 Kommentare

  1. Kleiner Hinweis noch, einer Variable, wie in deinem Fall „ip“ in der for-Schleife, den selben Namen wie ein builtins oder Befehl zu geben, kann im Einzelfall nach hinten los gehen.

  2. Danke für den Artikel. Habe mir etwas ähnliches (allerdings inzwischen deutlich umfangreicher) zum Aktualisieren meiner diversen virtuellen Server gebaut. Vielleicht sollte ich mir doch mal Ansible anschauen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Schaltfläche "Zurück zum Anfang"
Schließen

Ooopsi!

Bitte deaktiviere Deinen Adblocker.