Administration von Unix-Rechnern mit cfengine
Ausgewählte Aktionen
- cfengine enthält zahlreiche Möglichkeiten, um Aktionen zu spezifizieren, die getroffene Auswahl ist subjektiv, z.B. wurde auf die Behandlung der NFS-Unterstützung verzichtet
control
- die section control: ist das Herzstück eines cfengine-Programms
- Definition von Variablen, Makros und Ablaufbedingungen
- Organisation des Ablaufs in der actionsequence
- Syntax:
-
control: class::
variable = ( list or value )
- es gibt Bezeichner (variable), mit vordefinierter Bedeutung, die wichtigsten sind
-
- access
-
wer darf das Script abarbeitencontrol:
access = ( root ) - actionsequence
-
Reihenfolge der Bearbeitung einzelner sections, in der Liste werden die zu bearbeitenden sections aufgezählt, ggf. ergänzt um Klassendefinitionencontrol: solaris::
actionsequence = ( links.firstpass copy tidy links.secondpass )
linux::
actionsequence = ( links copy tidy ) - editfilesize
-
maximale Größe eines editierbaren Files, größere Files werden in der section editfiles: nicht bearbeitetcontrol: editfilesize = ( 5000 )
- excludecopy/excludelinks
-
definiert eine Liste von Filenamen oder Filenamensmustern, die von allen Kopier-/Linkaktionen ausgeschlossen werdencontrol: excludecopy = ( *~ core *old *save )
excludelinks = ( *~ core *old *save ) - Syslog
steuert die Art der Protokollierung, normalerweise (Schalter: Off) schreibt cfengine die Ausgaben nach stdout; mit dem Schalter On werden die Ausgaben über den syslog-Mechanismus protokolliert - Inform
-
Schalter zum Steuern des Umfangs der Ausgaben, normalerweise (Schalter: Off) berichtet cfengine nur Fehler; mit dem Schalter On werden alle ausgeführten Aktionen protokolliert, sofern das nicht durch die Aktion silent individuell angegeben istcontrol: Inform = ( On )
- repository
-
definiert ein Verzeichnis, in welches Files gesichert werden, die bei Kopier-, Lösch- und Editieroperationen verändert werden, dabei wird das Zeichen / in Pfadnamen durch das Zeichen _ ersetztcontrol: repository = ( /var/cfsave )
- SplayTime
-
definiert einen zufälligen Zeitraum im Bereich von 0 bis zum angegebenen Wert in Minuten, der vergehen muß, ehe das Programm startet. Damit wird die Last an Fileservern reduziert, die ensteht, wenn zahlreiche Maschinen zur selben Zeit (gesteuert durch cron) ein und dasselbe File lesen wollen.control: SplayTime = ( 20 )
copy
- Kopieren von Files oder Verzeichnishierarchien (aus einem Netz-Filesystem in das lokale Filesystem)
- der Kopiervorgang erfolgt zunächst in ein File mit der Endung .cfnew, wenn der Kopiervorgang erfolgreich war, wird das File umbenannt (vermeidet Probleme durch Netzunterbrechungen, voll laufende Filesysteme, etc.)
- der Kopiervorgang wird nur durchgeführt, wenn das Zielfile noch nicht oder nicht identisch mit dem Quellfile existiert
- zur Kontrolle können benutzt werden: Modifikationszeit (ctime), MD5-Prüfsumme (checksum/sum), Fileinhalt selbst (byte/binary)
- Syntax:
-
copy: class::
master_file dest=destination_file
mode=mode
owner=owner
group=group
action=warn|silent|fix
backup=true|false
symlink=pattern
include=pattern
exclude=pattern
ignore=pattern
recurse=number|inf|0
type=ctime|checksum|sum|byte|binary
linktype=absolute|symbolic|relative|hard|copy|none
define=class-list(,:.)
force=true|on|false|off
size=size_limits
server=cfd_server_host
purge=true|false
syslog=true|on|false|off
inform=true|on|false|off
- master_file bezeichnet ein File oder ein Verzeichnis, welches übernommen werden soll
- destination_file ist der Name des Zielobjektes im lokalen Filesystem
- falls eine Kopieraktion durchzuführen ist, wird ein bereits existierendes File mit der Endung .cfsaved versehen (backup=true ist Standard) bzw. in das repository-Verzeichnis verschoben
- recurse gibt an, wieviele Verzeichnisebenen rekusiv behandelt werden sollen, recurse=inf bezeichnet dabei die Übernahme eines kompletten Verzeichnisbaums (Vorsicht: es werden Mount-Punkte überschritten)
- in define kann man Klassen aufzählen, die definiert werden sollen, wenn die Kopieraktion ausgeführt wurde
- purge veranlaßt das Löschen von Files im Zielverzeichnis, die nicht im Quellverzeichnis enthalten sind
- Beispiel:
-
control: afsroot = ( /afs/tu-chemnitz.de/product/afs/3.4a )
afssys = ( @sys )
afsclient = ( root.client/usr/vice/etc )
actionsequence = ( copy )copy:
any::
# Binaries
$(afsroot)/$(afssys)/$(afsclient)
dest=/usr/vice/etc
owner=root
mode=g-w,o-w
backup=false
recurse=3
exclude=CellServDB.sample
define=reboot
# CellServDB
/afs/tu-chemnitz.de/common/etc/CellServDB
dest=/usr/vice/etc/CellServDB
mode=0644
backup=true
files
- Erzeugen (touch) von Files, Überprüfen des Vorhandenseins, der Eigentümerangaben, Zugriffsrechte und Setzen dieser Angaben
- Syntax:
-
files: class::
/file_object mode=mode
owner=owner_list
group=group_list
recurse=number|inf|0
action=warnall|warndirs|warnplain| \
fixall|fixdirs|fixplain| \
touch|linkchildren|create
links=false|stop|traverse|follow|tidy
include=pattern
exclude=pattern
ignore=pattern
define=class-list(,:.)
syslog=true|on|false|off
inform=true|on|false|off
- wenn action nicht anders spezifiziert wird, prüft cfengine, ob das angegebene File/Verzeichnis mit den spezifizierten Angaben (Eigentümer, Rechte) existiert und erzeugt ggf. Warnungen
- die Angabe von action=fixall|fixdirs|fixplain korrigiert die Werte
- bei define angegebene Klassen werden definiert, wenn eine Korrektur ausgeführt wurde
- Beispiel:
-
files:
solaris::# AUSCERT-Advisory AA-97.10
/usr/bin/eject mode=0555 owner=root group=bin action=fixplain
# AUSCERT-Advisory AA-97.11
/usr/bin/fdformat mode=0555 owner=root group=bin action=fixplain
directories
- Einrichten von Verzeichnissen
- Syntax:
-
directories: class::
/directory mode=mode
owner=owner
group=group
define=class-list(,:.)
syslog=true|on|false|off
inform=true|on|false|off
- richtet einzelne Verzeichnisse oder Verzeichnishierarchien ein
- Beispiel:
-
directories: any::
/usr/local/bin m=0755 o=root g=root
links
- Prüfen und Einrichten von Links
- Syntax:
-
links: class::
from_link ->[!] to_object
or
from_link +>[!] to_objecttype=symbolic|absolute|abs|hard|relative|rel
copy=pattern
recurse=number|inf|0
copytype=checksum|ctime
include=pattern
exclude=pattern
ignore=pattern
action=warn|silent
deadlinks=kill|force
define=class-list(,:.)
nofile=kill|force
syslog=true|on|false|off
inform=true|on|false|off
- wenn from_link existiert und auf to_object verweist, erfolgt keine Aktion; existiert from_link verweist aber nicht auf to_object wird eine Warnung ausgegeben, es sei denn, der Operator ! ist angegeben, dann wird der Link korrigiert
- wenn from_link existiert und to_object existiert nicht, wird eine Warnung ausgegeben, es sei denn, die Option -L wurde beim Aufruf angegeben, dann wird der Link gelöscht
- bei Verwendung des Operators -> werden immer nur einzelne Files oder Verzeichnise gelinkt, der Operator +> organisiert das Erstellen von Links für alle Einträge in einem Verzeichnis (ggf. rekusiv)
- Beispiel:
-
links: any::
/usr/afsws ->! $(afsroot)/$(afssys)
tidy
- Löschen von Files
- die zu löschenden Files werden beschrieben über Namensmuster, Filealter und Filegröße
- Syntax:
-
tidy: class::
/name pattern=pattern
recurse=number|inf|0
age=days
size=number|empty
type=atime|ctime|mtime
dirlinks=keep|tidy|delete
rmdirs=true|false |all|sub
links=stop|false|traverse|true|follow|keep|tidy
define=class-list(,:.)
syslog=true|on|false|off
inform=true|on|false|off
- dirlinks gibt an, ob Links, die auf Verzeichnisse verweisen, gelöscht werden sollen
- links gibt an, ob Links, die auf Verzeichnisse verweisen, verfolgt werden sollen, durch den Wert tidy wird das Löschen von Links veranlaßt, die auf nicht existierende Files verweisen
- size gibt an, daß nur solche Files gelöscht werden sollen, die größer als der angegebene Wert und älter als bei age angegeben sind
- type gibt an, um welche Zeitangabe es sich bei age handelt
- Beispiel:
-
tidy: any::
/tmp age=7 recurse=inf rmdirs=true
/tmp pattern=core age=2 recurse=inf
disable
- Umbenennen von Files, rotieren von Files, Löschen von Links
- Syntax:
-
disable: class::
/name type=plain|file|link|links
rotate=emtpy|truncate|number
size=number
define=class-list(,:.)
syslog=true|on|false|off
inform=true|on|false|off
- das Umbenennen der Einträge geschieht durch Anhängen der Endung .cfdisabled bzw. das Verschieben in das repository Verzeichnis
- bezeichnet name einen symbolischen Link, so wird dieser entfernt
- mittels type kann man den Typ von name angeben, name wird dann nur behandelt, wenn es vom spezifizierten Typ ist
- rotate wird benutzt, um Filegenerationen zu erzeugen (Verwaltung von Logfiles), ggf. kann das alte File dabei sofort gelöscht werden (empty oder truncate)
- size gibt die Bedingung an, unter der die Operation ausgeführt werden soll (size>=400k bedeutet, daß die Operation nur ausgeführt werden soll, wenn das spezifizierte File mindestens 400K groß ist)
- Beispiel:
-
disable: solaris::
/etc/rc3.d/S99afs type=linksolaris.Wednesday|Sunday::
/var/adm/messages rotate=4 size=50k
editfiles
- Editieren von Textfiles
- zahlreiche Möglichkeiten, ca. 70 verschiedene, teilweise recht komplexe Editieranweisungen
- Syntax:
-
editfiles: class::
{ file_to_be_edited
action "string"
...
}
- Beispiel:
-
control: actionsequence = ( editfiles )
hpux::
afsrc = ( /etc/afsrc )hpux10::
afsrc = ( /sbin/init.d/afs )solaris::
afsrc = ( /etc/init.d/afs.rc )sun4|ultrix::
afsrc = ( /etc/rc.afs )editfiles:
solaris::
{ /etc/init.d/lp
BeginGroupIfNoLineMatching "# AUSCERT AA-97.15"
LocateLineMatching "state=$1"
IncrementPointer "-1"
InsertLine "# AUSCERT AA-97.15"
InsertLine "umask 022"
EndGroup
}{ /etc/rmmount.conf
BeginGroupIfNoLineMatching "# AUSCERT AA-96.04"
LocateLineMatching "# Actions"
InsertLine "# AUSCERT AA-96.04"
HashCommentLinesStarting "action"
EndGroup
}
any::{ $(afsrc)
ReplaceAll "-dcache 180 " With "-dcache 800 "
ReplaceAll "-dcache 240 " With "-dcache 2400 "
ReplaceAll "/bosserver/" With "/bosserve/"
}
shellcommands
- Ausführen beliebiger Kommandos oder Scripte
- Syntax:
-
shellcommands: class::
"command" timeout=seconds
useshell=true|false
- wenn angegeben, unterbricht cfengine die Aussführung command nach der in timeout spezifizierten Zeit
- als Argumente an command können die Variablenwerte übergeben werden; wenn eine Variable eine Liste definiert (standardmäßig getrennt durch : ) , so wird über diese Liste iteriert
- Beispiel:
-
control: actionsequence = ( shellcommands )
libs = ( /usr/vice/etc/dkload/libafs.a:/usr/vice/etc/dkload/libafs.nonfs.a )
shellcommands:
solaris.reboot::
"/usr/sbin/shutdown -y -g0 -i6"sun4::
"/bin/ranlib -t $(libs)"
- in diesem Beispiel führt die Notation "/bin/ranlib -t $(libs)" zu zwei Aufrufen von ranlib
processes
- Prüft, ob Prozesse laufen
- sendet Signale an Prozesse
- führt einen re-start von Prozessen aus
- Syntax:
-
processes:
class::"process_name" restart "command"
useshell=true|false|dumb
signal=signal_name
matches=number
include=literal
exclude=literal
action=signal|do|warn
define=class-list(,:.)
syslog=true|on|false|off
inform=true|on|false|off
SetOptionString "ps_options"
- Prozesse werden aufgrund des ausgeführten Programms identifiziert (process_name)
- cfengine benutzt ps um die PID zu ermitteln, dabei wird eine Ausgabe erwartet, bei der in der ersten Spalte die PID steht
- cfeninge verwendet dafür die Optionen -aux in BSD-Systemen und -ef im System V
- eine Anpassung dieser Optionen ist möglich mit SetOptionString
- matches spezifiziert eine Anzahl von Prozessen, deren Namen mit dem Muster process_name übereinstimmt, die mindestens, höchstens oder genau laufen müssen
- Beispiel:
-
control: actionsequenze = ( copy processes )
copy:
any::
$(master)/etc/inetd.conf
dest=/etc/inetd.conf
mode=0644
owner=root
group=root
type=checksum
define=inetdprocesses:
inetd::
"inetd"
signal=hup
any::"rc5client"
signal=kill
".*hacker.*crack.*"
signal=kill
import
- dient der Strukturierung von cfengine-Programmen
-
import: class::
file
- Achtung: Variablendefinitionen gelten jeweils nur im importierten File und werden nicht in das importierende File übernommen
- Beispiel:
-
% cat cfengine.conf
import:
any::
cf.linux_Classes
cf.linux_Main
...
% cat cf.linux_Classes
classes:
Referenz = ( wotan platon oedipus )
SambaServer = ( foxtrott rumba tango twist mambo )
...
% cat cf.linux_Main
import:
Referenz:: cf.linux_Referenz
SambaServer:: cf.linux_SambaServer
control:
any::
access = ( root )
BASEDIR = ( /afs/tu-chemnitz.de/admin/linux/REDHAT/CFENGINE/ROOTS )
actionsequence = (
disable
directories
copy
...
)
...
% cat cf.linux_Referenz
copy:
Referenz::
$(BASEDIR)/root4Referenz
dest=/
type=checksum
... - cfengine analysiert zuerst das importierende File und anschließend die importierten Files
03. Dezember 1997, überarbeitet: 01. Dezember 1998
Thomas Müller, TU Chemnitz, URZ