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.