# Cdist

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 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.

## Entwicklung

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.
Wie in der Open-Source-Softwareentwicklung üblich, erfolgt die Kommunikation über Mailinglisten und IRC.

## Funktionen

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.

## Installation und Konfiguration

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. 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

cdist besteht aus zwei Komponenten
* Kern
* Konfiguration

### Kern

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

Die Konfiguration ist in Bash geschrieben und besteht aus
* dem initialen Manifest, welches den Host beschreibt und Types zugeordnet ist,
* Global Explorers um Informationen über das Zielsystem zu sammeln,
* 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

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. 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

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:
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:
Mit Hilfe der Environmentvariable require werden Abhängigkeiten ausgedrückt:
Der Zugriff auf Pfade und Dateien innerhalb von Types erfolgt durch Umgebungsvariablen wie $__object.