Cfengine
Was ist cfengine?
Cfengine wurde entwickelt, um größere Menge an Rechnern auf dem gleichen Installations- bzw. Konfigurationsstand zu halten.
Homepage:
Cfengine
Verzeichnisstruktur
Server
/var/cfengine/server/cfservd.conf Konfigurationsdatei für den Cfengine-Server /var/cfengine/server/logs Log-Dateien des Cfengine-Servers
Client
/var/cfengine/config Hier liegen die Dateien fürs Update /var/cfengine/inputs Hier liegt die Konfiguration für die Updates /var/cfengine/outputs /var/cfengine/ppkeys Hier werden die Keys von Server und Client abgelegt
Vorsicht! Diese Angaben beziehen sich auf das hier erhältliche RPM Paket. Je nach Konfiguration und Compile-Optionen kann sich cfengine anders verhalten.
Konfiguration
Server
Um cfengine verwenden zu können wird ein Server benötigt, der die
entsprechende(n) Konfiguration(en) verwaltet.
Das Server-Tool cfservd holt seine Einstellungen aus einer Datei
cfservd.conf. Wo er beim Start nach dieser sucht, legt die Umgebungsvariable
CFINPUTS fest.
linux ~# export CFINPUTS=/var/cfengine
Bei dem bereitgestellten RPM Paket erledigt dies jedoch das dazugehörige Init-Skript. Die eigentliche Server-Konfiguration (s. unten) beinhaltet hauptsächlich Zugriffsberechtigungen und grundlegende Einstellungen.
Vorsicht! Ältere Versionen von cfengine (<2.0.3) hatten Probleme mit der Namensauflösung (z.B. *.uni-erlangen.de)
control: domain = ( rrze.uni-erlangen.de ) AllowConnectionsFrom = ( *.uni-erlangen.de ) # make sure to use IP addresses here TrustKeysFrom = ( 131.188.0.0/16 ) workdir = ( /var/cfengine ) admit: $(workdir)/inputs *.rrze.uni-erlangen.de $(workdir)/config *.rrze.uni-erlangen.de
Das obige Beispiel für cfservd.conf erlaubt allen Clients der Domain rrze.uni-erlangen.de den Zugriff auf die Verzeichnisse /var/cfengine/inputs und /var/cfengine/config.
Die genauere Konfiguration findet sich im Unterverzeichnis $(workdir)/inputs.
Um deren Aufbau zu verstehen, sollte man einige Hintergrundinformationen besitzen. Wie man an den Beispielen leicht erkennen kann, wird die Konfiguration immer in einzelne Abschnitte unterteilt (control:, resolve:, import:, etc.)
Ferner basieren die Einstellungsmöglichkeiten von cfengine auf verschiedenen Klassen. Diese Klassen lassen sich frei definieren (s. cf.linux.autofs - classes:), es gibt aber eine ganze Reihe von vordefinierten Werten. Dazu gehören unter anderem das Betriebssystem (z.B. "linux", "SuSE"), Informationen über die IP-Adresse des Rechners (z.B. "131_188_3_145", "linux_rrze_uni_erlangen_de"), die Kernel-Version (z.B. "linux_2_4_18_4GB"), Zeitangaben (z.B. "Wednesday", "Hr09", "Min14") , usw.
Diese Klassen lassen sich miteinander verknüpfen. Im Beispiel cf.linux.autofs betreffen die Anweisungen unter linux.autofsinstalled:: nur Linux-Rechner mit installierten autofs. Der . steht dabei für eine UND-Verknüpfung, eine Negierung einzelner Komponenten läßt sich mit ! bewerkstelligen.
Auf der Client-Seite braucht man beim ersten Start zwei Dateien im Verzeichnis /var/cfengine/inputs:
- update.conf
- cfagent.conf
update.conf
#######
#
# BEGIN update.conf
#
# This script only distributes the configuration, a simple file so that,
# if there are syntax errors in the main config, we can still
# distribute a correct configuration to the machines afterwards, even
# though the main config won't parse. It is read and run just before the
# main configuration is parsed.
#
#######
control:
actionsequence = ( copy tidy ) # Keep this simple and constant
domain = ( rrze.uni-erlangen.de )
workdir = ( /var/cfengine )
policyhost = ( ciplx1.e-technik.uni-erlangen.de )
master_cfinput = ( /var/cfengine/server/inputs )
filedir = ( /var/cfengine/server/config )
############################################################################
#
# Make sure there is a local copy of the configuration and
# the most important binaries in case we have no connectivity
# e.g. for mobile stations or during DOS attacks
#
copy:
$(master_cfinput) dest=$(workdir)/inputs
r=inf
mode=700
type=binary
exclude=*.lst
exclude=*~
exclude=#*
exclude=.*
server=$(policyhost)
trustkey=true
#####################################################################
tidy:
#
# Make sure we don't choke on our own words!
#
$(workdir)/outputs pattern=* age=7
#######
#
# END update.conf
#
#######
cfagent.conf
#####################################################################
import:
#any:: cf.all
linux:: cf.linux
#####################################################################
cf.linux
control:
actionsequence = ( copy )
filedir = ( /var/cfengine/server/config )
import:
any::
cf.nomoretrust
linux::
cf.linux.hosts
cf.linux.apt
cf.linux.ssh
cf.linux.autofs
cf.linux.inetd
cf.linux.mozilla
cf.linux.cron
cf.linux.x11
cf.linux.autofs
classes: autofsinstalled = ( '/usr/bin/test -x /usr/sbin/automount' ) control: actionsequence = ( copy shellcommands ) copy: linux.autofsinstalled:: $(filedir)/linux/etc/auto.master dest=/etc/auto.master type=checksum server=$(policyhost) o=root g=root m=644 define=autofs_restart $(filedir)/linux/etc/auto.proj dest=/etc/auto.proj type=checksum server=$(policyhost) o=root g=root m=644 define=autofs_restart shellcommands: autofs_restart:: "/etc/init.d/autofs restart"
Die Kommandos (wie z.B. unter shellcommands), müssen stets mit komplettem Pfad angegeben werden.
Probleme
Es kann vorkommen, dass sich cfengine --debug --verbose mit einigen der folgenden Fehlermeldungen beschwert:
cfengine:: Another cfengine seems to have done XYZ since I started
Sollte du diesem Zeitpunkt keine zweite cfagent Instanz gelaufen sein, dann kann man den Fehler durch das Löschen der Datei /var/cfengine/cfengine_lock_db beseitigen.



