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 abarbeiten
      control: 
        
        access = ( root )
    • actionsequence

    • Reihenfolge der Bearbeitung einzelner sections, in der Liste werden die zu bearbeitenden sections aufgezählt, ggf. ergänzt um Klassendefinitionen
      control: 

        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 bearbeitet
      control: 

          editfilesize = ( 5000 )

    • excludecopy/excludelinks

    • definiert eine Liste von Filenamen oder Filenamensmustern, die von allen Kopier-/Linkaktionen ausgeschlossen werden
      control: 

          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 ist
      control: 

           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 _ ersetzt
      control: 

           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_object 

          type=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=link 

      solaris.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=inetd 

    processes: 

      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