cdist ist ein Open-Source-Administrationsprogramm. Der Hauptanwendungsanfall ist die automatisierte Konfiguration mehrerer Computer über ein Netzwerk. Dabei können Konfigurationsparameter zum Beispiel die Installation von Software, Datensynchronisation oder das Ausführen von Programmen sein.

cdist

Basisdaten

Hauptentwickler Nico Schottelius, Steven Armstrong
Entwickler ungleich GmbH
Aktuelle Version 6.0.3
(31. Oktober 2019[1])
Betriebssystem Linux, Unixoide Betriebssysteme
Programmier­sprache Python, Bash
Kategorie Konfigurationsmanagement
Lizenz GPLv3
deutschsprachig nein
https://www.cdi.st/

Cdist verfolgt das KISS-Prinzip und lenkt die Netzelemente mit Hilfe von SSH. Dabei muss, im Gegensatz zu anderen Konfigurationswerkzeugen, nur SSH und eine POSIX-kompatible Shell z. B. Bash installiert sein. Sogenannte Types beschreiben einen beabsichtigten Zustand eines Netzelementes und sind in Bash geschrieben. Das System verwendet gewöhnliche Shell-Skripte und Funktionen um wiederverwendbare Beschreibungen auszudrücken. Der Kern der Software, welcher die Befehlsabfolge und das Ausführen von Code auf den Netzelementen verwaltet, ist in Python geschrieben.[2]

Entwicklung

Bearbeiten

Die Entwicklung von cdist startete im Jahr 2010 im Umfeld der ETH Zürich, an der Schottelius und Armstrong als Systemadministratoren tätig waren. Dabei nutzten sie Konfigurationsmanagementsysteme wie Puppet und stießen auf Softwaredesign-Probleme, so dass der Entschluss gefasst wurde, ein eigenes Konfigurationsmanagementsystem umzusetzen.[3][4]

Wie in der Open-Source-Softwareentwicklung üblich, erfolgt die Kommunikation über Mailinglisten und IRC.[5]

Funktionen

Bearbeiten

cdist ist ein „null“-Abhängigkeiten-Konfigurationsmanagementsystem, da Abhängigkeiten in unixoiden Betriebssystemen bereits installiert sind. Dadurch ist es auch möglich, dass cdist genutzt werden kann, um andere Konfigurationsmanagementsysteme zu laden.[6]

Installation und Konfiguration

Bearbeiten

Im Gegensatz zur traditionellen Installation als Paket – z. B. .deb oder .rpm – wird cdist mit Hilfe von git installiert. Alle Kommandos laufen nach dem Auschecken aus dem Software-Repository. Der Eintrittspunkt für jede Konfiguration ist das Shell-Skript conf/manifest/init, welches im cdist Kontext auch als initiales manifest bezeichnet wird.

Die Hauptkomponente von cdist wird type genannt und bündelt die Funktionalitäten.[7] Dabei bestehen sie im Wesentlichen aus einer Anzahl von Shell-Skripten, die definieren, welche types erneut genutzt werden und welcher Code erzeugt wird, um diesem auf dem Zielhost auszuführen.

Architektur

Bearbeiten

cdist besteht aus zwei Komponenten

  • Kern
  • Konfiguration

Der Kern von cdist ist in Python 3 implementiert und stellt die Dateien bereit, um den Zielhost zu konfigurieren. Der Kern arbeitet in einem Push-Modell: er verbindet sich vom Quell-Host zum Ziel-Host und konfiguriert das Netzelement. Zu Kommunikation und Datentransfer wird SSH genutzt. Es besteht die Möglichkeit mehrere Hosts parallel zu konfigurieren. Dabei nutzt der Kern einen entsprechenden Modus und erstellt Kindprozesse für jede Verbindung. Dieses Modell erlaubt es horizontal mit den vorhandenen Rechenressourcen zu skalieren. Wenn eine bestimmte Grenze erreicht ist und die Kapazität der verfügbaren CPUs aufgebraucht sind, kann man entweder weitere CPUs hinzufügen oder cdist auf mehreren Hosts verteilen, so dass man mehr Hosts parallel konfigurieren kann.

Konfiguration

Bearbeiten

Die Konfiguration ist in Bash geschrieben und besteht aus

  1. dem initialen Manifest, welches den Host beschreibt und Types zugeordnet ist,
  2. Global Explorers um Informationen über das Zielsystem zu sammeln,
  3. Types, welche die Funktionalität bereitstellen und aus einem Manifest, Type Explorers und Gencode Skripten bestehen.

Obwohl diese alle in Shell-Skript geschrieben sind, spielt die Reihenfolge der Ausführung in den Manifesten keine Rolle: cdist benutzt eine idempotente Konfiguration.

Vergleich

Bearbeiten

Im Vergleich mit der meisten Konfigurationsmanagement Software benötigt cdist nur SSH und eine Bash-kompatible Shell auf einem Zielrechner. Auf dem Quell-Host wird Python 3.2 benötigt.[2] cdist arbeitet push-basierend, d. h. die Konfigurationen wird von einem Server zu den Clients geschoben werden, so dass die Clients nicht nach Updates fragen.

Konfigurationssprache

Bearbeiten

Alle konfigurierbare Teile enthalten ein Manifest oder Gencode-Scripte, die in Shell-Skript geschrieben sind. Shell-Skripte wurden gewählt, da Unix System Administratoren gewöhnlicherweise geübt sind im Schreiben und lesen von Shell-Skripten. Weiterhin sind Shell-Skripte häufig auf vielen Zielsystemen möglich, ohne Zusatzsoftware installieren zu müssen.

cdist liest seine Konfiguration vom initialen Manifest (conf/manifest/init), in welchen die Hosts als Types abgebildet werden:

case "$__target_host" in
    myhostname)
        __package zsh --state present
        __addifnosuchline /tmp/cdist-welcome --line "Welcome to cdist"
    ;;
esac

Wenn cdist Types benutzt, werden diese wie normale Programme in Manifesten aufgerufen und können dabei Gebrauch vom erweiterten Parameter-Parsing machen, sowie dem Lesen von stdin:

# Provide a default file, but let the user change it
__file /home/frodo/.bashrc --source "/etc/skel/.bashrc" \
   --state exists \
   --owner frodo --mode 0600

# Take file content from stdin
__file /tmp/whatever --owner root --group root --mode 644 --source - << DONE
Here goes the content for /tmp/whatever
DONE

Mit Hilfe der Environmentvariable require werden Abhängigkeiten ausgedrückt:

      __directory /tmp/foobar
      require="__directory//tmp/foobar" __file /tmp/foobar/baz

Der Zugriff auf Pfade und Dateien innerhalb von Types erfolgt durch Umgebungsvariablen wie $__object.

Siehe auch

Bearbeiten
Bearbeiten

Einzelnachweise

Bearbeiten
  1. Changelog cdist 6.0.3, abgerufen am 31. Oktober 2019.
  2. a b cdist: Why we require Python 3.2 on the source host. Nico.schottelius.org, abgerufen am 14. Juni 2017.
  3. Nico Schottelius: Migrating away from puppet to cdist. 4. April 2011, abgerufen am 12. Juli 2017.
  4. Nico Schottelius: In puppet, $name is not always what you expect. Abgerufen am 12. Juli 2017.
  5. Archivierte Kopie der Mailingliste. Archiviert vom Original (nicht mehr online verfügbar) am 21. November 2011; abgerufen am 12. Juli 2017.
  6. Puppet bootstrap: via cdist. Groups.google.com, 2. Mai 2011, abgerufen am 14. Juni 2017.
  7. cdist-type(7). Nico.schottelius.org, archiviert vom Original (nicht mehr online verfügbar) am 3. März 2016; abgerufen am 10. April 2016.