Netzwerkweite Konfiguration mit cfengine
Disclaimer
Dieses Howto erhebt keinerlei Anspruch auf Vollständigkeit, Richtigkeit sowie Korrektheit der Angaben und gibt keine Garantie auf die Funktionsfähigkeit. Es wurde aus eigenen Erfahrungen beim Einrichten der Software geschrieben. Für Datenverlust oder andere Schäden, die durch Gebrauch dieses Howtos auftreten, ist jeder selbst verantwortlich und es wird hierfür keinerlei Haftung übernommen.
Alle verwendeten Markennamen sind eingetragene Warenzeichen der jeweiligen Inhaber.
Einleitung
Mit dem Wachstum eines Netzes und ständig neuen Server die bevorzugt unter Linux-/Unix-Systemen laufen sollen, stellte sich mir irgendwann die Frage nach einer zentralen Konfigurationsmöglichkeit. Es war einfach lästig z. B. auf allen Maschinen ein alias ll='ls -l' zu setzen. Mit cfengine habe ich das Programm für diesen öden Job gefunden. Die Änderungen an den wichtigen Konfigurationsdateien werden für definierte Systeme gleich gehalten. Die Dateiberechtigungen passen und man kann alle Dateien in ein Versionsverwaltungssystem (cvs, subversion, ...) packen. Damit wann weiss warum es gestern noch lief. Mit der Einführung von cfengine musste ich mir angewöhnen eben die Änderung nicht auf der Maschine direkt sondern auf dem zentralen Server zu machen, aber man wir dafür mit mehr Zeit für Tetris belohnt. Und informieren Sie Ihre Kollegen, dass cfengine läuft. ;-) Die Dokumentation zu den cfengine-Programmen ist sehr gut. Hier möchte ich nun meine eigenen praktischen Erfahrungen dokumentieren, in der Hoffung dass es vielleicht jemanden hilft.
Debian-spezifisches
Die Debian-Policy schreibt richtigerweise vor, dass alle Konfigrationsfiles unterhalb von /etc liegen sollen und ggfs. der Rest über symbolische Links gelöst wird. Nun prüft aber cfengine den Unterschied zwischen Datei/Verzeichnis und Link und bemängelt hier die Links. Ich habe daher die Links /var/lib/cfengine2/inputs und /var/lib/cfengine2/bin gelöscht und durch reguläre Verzeichnisse ersetzt. Eine der debian:-Klassse zugeordnete Kopieranweisung nach /etc/cfengine tut der Policy genüge und lässt die Ursprungsdateien unter /var/lib/cfengine2.
Den zentralen Server konfigurieren
Für die Anfangskonfiguration der Clients braucht man nur zwei Dateien zu kopieren. Einmal die update.conf und eine, bei mir cf.linux_main genannte, Datei. Die update.conf enthält in der control:-Sequenz Variablen zu den workdir-Verzeichnissen. Da sich diese aber bei den einzelnen Distributionen unterscheiden hilft folgende Aufsplittung auf die vordefinierten Klassen (cfagent-qnv)
debian::
workdir = ( /var/lib/cfengine2 )
redhat::
workdir = ( /var/cfengine )
Gleiches gilt für die cf.linux:main
debian::
REPOSITORY = ( /var/lib/cfengine2/repository
BASEDIR = ( /var/lib/cfengine2/inputs )
redhat::
REPOSITORY = ( /var/lib/cfengine/repository )
BASEDIR = ( /var/lib/cfengine/inputs )
Vom Master muss noch der öffentliche Schlüssel auf den Client. Er liegt bei Debian entsprechend umbenannt unter /var/lib/cfengine2/ppkeys/root-<IP-des-Servers>.pub. Er kommt wiederrum ins dortige ppkeys-Verzeichnis.
Einen Client unter Debian Sarge einrichten
Für Ubuntu sollten die hier gemachten Aussagen ebenso zutreffen.
Auf den Debian-Clients brauchen nicht alle cfengine-Dämonen zu laufen. Dahe sollte die Datei /etc/default/cfengine2 wie folgt aussehen:
RUN_CFSERVD=0
RUN_CFEXECD=1
RUN_CFENVD=0
Einen Client unter Whiteboxlinux 3.0 (RHEL-Clone) einrichten
Folgt.
Einen Client unter FreeBSD 6.0 einrichten
Folgt.
Auf den Client soll nur das was er auch braucht.
Mit dem zentralen Vorhalten der Konfigurationen ergibt sich
das Problem, dass die spezifisch kopierten Dateien vom
cfagent bei der Verarbeitung eingelesen werden
sollen. Dieser Vorgang läuft in einem Schritt ab,
d. h. die Dateien werden kopiert und eingelesen. Es liegt
jedoch nur die gewünschte Teilmenge der
Konfigurationsdateien (die wiederum Anweisungen wie
files enthalten) vor. Ich habe das Problem in zwei
Schritten gelöst.
Einen Datei z. B. cf.linux_copy enhält die
Anweisungen zum Kopieren der Dateien, wenn der Client der
entsprechenden Klasse agehöhrt:
copy:
APACHE::
${MASTERFILES}/cf-apache/cf.linux_apache dest=${BASEDIR}/cf.linux_apache o=root g=root m=600 type=checksum backup=false server=${FILEMASTER}
In einem zweiten Schritt wird auf dem Client geprüft, ob er dieser Klasse angehöhrt und wenn ja, so soll er die entsprechende Konfig laden (cf.linux_import).
control:
apacheconf = ( ${BASEDIR}/cf.linux_apache )
sambaconf = ( ${BASEDIR}/cf.linux_samba )
...
groups:
isapacheconf = ( IsPlain(${apacheconf}) )
issambaconf = ( IsPlain(${sambaconf}) )
...
import:
isapacheconf:: ${apacheconf}
issambaconf:: ${sambaconf}
...
So ist sichergestellt, dass jeder Client nur den für ihn wichtigen Teil der gesamten Netzkonfiguration kennt und benutzt.
Copyright and License
This document, Systemverwaltung mit cfengine, is copyrighted (c) by Tom Geißer,.
Letzte Änderung: 22.03.2006
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is available at http://www.gnu.org/copyleft/fdl.html.