Konfigurationsmanagement

From NJH-Wiki

Jump to: navigation, search
Autor 
Frank Prößdorf

Contents

Vergleich der Software

Es werden hier drei OpenSource Programme zum Konfigurations- und Patchmanagement miteinander verglichen. Ich bitte um Ergänzungen und Korrekturen.

Eigenschaften cfengine puppet bcfg2
Lizenz

First Release

GPL + parts of FAL

1993

GPL

2005 (relativ neu)

2 clause BSD style

2004

Programmiersprache C Ruby Python
Plattformen linux, solaris, macos x, nt, win2k, irix, ultrix, sunos, aix, bsds, hpux linux, solaris, macos x, bsds linux, solaris, macos x (partial), aix (partial), freebsd
URL http://www.cfengine.org/ https://puppet.reductivelabs.com/ http://trac.mcs.anl.gov/projects/bcfg2
Architektur Client/Server Client/Server

Datentransfer über XML-RPC

Client/Server

Datentransfer über XML-RPC

Modell systemnah abstrakt
Sprachart imperativ (1)/deklarativ deklarativ deklarativ
Abhängigkeiten openssl, bdb>4.4, yacc, flex ruby, fracter python, libxml2, libxslt, lxml, pyrex, pyopenssl, fam, python-fam
Format Konfigurationsdatei Plain Text Plain Text XML
Sicherheit Client/Server Zertifizierung, RSA/Blowfish Client/Server Zertifizierung, SSL Verschlüsselung SSL Verschlüsselung
Verbreitung hoch gering gering
Features cfengine puppet bcfg2
Konfiguration für Nodes in LDAP speicherbar nein ja nein
Überwachung von Dateien ja ja ja
Symbolische Links und Dateirechte ja ja ja
Mounten von Dateisystemen NFS ja ja
Mitschnitt und Rollback der Systemänderungen nein ja ja
Kann Dateien auf Clients editieren ja nein nein
Aktionen zeitlich planen (Scheduling) ja/nein ? ja ? nein
Cronjobs verwalten nur über konfigurationsdateien ja nur über konfigurationsdateien
Kommandos ausführen ja ja vor und nach installation?
Konfigurationsdateien verwalten ja ja ja
Benutzer und Gruppen verwalten nur über konfigurationsdatei ja nur über konfigurationsdatei
Paketmanagement ja ja ja
Services verwalten ja ja ja
Aufräumen, Löschen von Dateien nach bestimmten Kriterien ja ja ja?
Failover, Load Balancing nein nein nein ?
Webinterface zur Konfigurationsstatusanalyse (Reporting) nein ja, experimentell ja
Verwaltung von DNS Zones und DHCP nur über konfigurationsdateien nur über konfigurationsdateien über webinterface
Überwachung der Festplattenfülle ja nein nein

Installation

Die gesamten Installationen finden auf einem SuSE Linux Enterprise Server 10 statt. Auf anderen Linux-Distributionen sollte der Vorgang ähnlich sein.

SVN

Um die Konfigurationsdateien zu verwalten, wuerde sich eine Versionsverwaltung gut eignen. SVN ist gegenüber CVS moderner und mächtiger.

Als root:

yast -i devs libapr1 libapr1-devel libapr-util1 libapr-util1-devel neon
cd /usr/lib && ln -s libexpat.so.1.5.0 libexpat.so.0 && cd /home/fp/src
ldconfig
rpm -i --nodeps subversion-1.3.0-1.1.20060120.i586.rpm
useradd -d /srv/svn -s /bin/false svn ; groupadd svn
/etc/init.d/svnserve start

svnadmin create configurations

cfengine:

mkdir cfengine
touch cfengine/sudo.cf
svn import cfengine file:///home/fp/configurations/cfengine -m "Initial Import"
rm -r cfengine && svn co file:///home/fp/configurations/cfengine

Nun können Änderungen im Ordner cfengine vorgenommen werden. Über svn add/ci/up/del wird das Projekt beeinflusst. svn status zeigt Änderungen.

puppet:

svn import /etc/puppet file:///home/fp/configurations/puppet -m "Initial import"
rm -rf /etc/puppet
cd /etc && svn co file:///home/fp/configurations/puppet

bcfg2:

svn import bcfg2 file:///home/fp/configurations/bcfg2 -m "Initial Import"
rm -r bcfg2
svn co file:///home/fp/configurations/bcfg2

Konfigurationsdateien:

mkdir configfiles
cp /etc/sudoers configfiles/ (als root)
svn import configfiles file:///home/fp/configurations/configfiles -m "Initial Import"
rm -r configfiles
svn co file:///home/fp/configurations/configfiles

cfengine

Anforderungen

  • bdb >= 4.4 (SRC)
  • openssl (SLES10 Paket)
  • openssl-devel (SLES10 Paket)
  • yacc (RPM)
  • flex (SLES10 Paket)

Installation

Berkeley DB installieren:

cd /home/fp/src/bdb/db-4.5.20.NC/build_unix
../dist/configure
make

Verändere Makefile (Workaround nötig zum RPM bauen, Grund ist nicht klar):

  • auskommentieren von @cd $(DESTDIR)$(docdir) && $(RM) -rf $(DOCLIST)

Paket bauen und installieren:

checkinstall -R make install

Pfad fuer BerkeleyDB in /etc/ld.so.conf eintragen und Linker aktualisieren:

ldconfig

Mit Hilfe von yast flex installieren. Danach noch yacc installieren

rpm -i byacc-1.9-24tr.i586.rpm
configure && make
checkinstall -R make install
/usr/local/sbin/cfkey


puppet

Anforderungen

  • ruby (RPM)
  • fracter (RPM)

Installation SLES10

Allgemeine Installation (Client und Server):

rpm -i ruby-1.8.4-17.12.i586.rpm
rpm -i facter-1.3.6-1.i386.rpm
rpm -i puppet-0.22.1-1.i386.rpm
puppet: unknown service
cp -a /usr/lib/site_ruby/1.8/* /usr/lib/ruby/site_ruby/1.8/

Entferne :lockdir Zeile aus der Client Konfigurationsdatei /etc/puppet/puppetd.conf .

Auf dem Server:

rpm -i puppet-server-0.22.1-1.i386.rpm

Ein einfaches Manifest site.pp in /etc/puppet/manifests/ anlegen:

file { "/etc/sudoers":
  owner => root, group => root, mode => 440
}

node server01 {
  include workstation
}

Masterserver starten und Puppet Benutzer und Gruppe anlegen:

puppetmasterd --mkusers

Auf dem Client:

puppetd --server <server> (if server has name "puppet", no -s option is necessary) --debug (if one wants to see what happens)

Hierbei sollte die Firewall entsprechend angepasst werden, so das die Anfrage vom Client den Server auch erreicht (Default Port: 8140).

Auf Master Client signieren:

puppetca --list
puppetca --sign <name> (autosigning possible, but not default)

Soll der Client neu aufgesetzt werden, so ist es sinnvoll das Zertifikat zunächst über --clean zu entfernen.

Init Script:

Da im Puppetpaket kein Init Script enthalten ist, sollten wir dieses nachträglich einbauen. Es ist unter anderem deshalb sinnvoll, weil dann, nach Installation, der Daemon automatisch gestartet wird. Hierzu ist es notwendig ein SRC RPM herunterzuladen und über
wget http://reductivelabs.com/downloads/rpm/SRPMS/puppet-0.22.3-1.src.rpm
rpm -i puppet-0.22.3-1.src.rpm
zu entpacken. Nun kopieren wir unser neues Init Script in das entsprechende Verzeichnis.
cp puppet.init /usr/src/packages/SOURCES/

Hinweis: Es ist jetzt ein Init Script für SuSE in den Quellen von Puppet enthalten. Dieses kann anstatt des selbst geschrieben verwendet werden.

Um den Installationprozess kümmert sich bei RPM Paketen die Spec Datei, welche im SRC Paket mit enthalten war. Wir finden diese unter /usr/src/packages/SPEC/puppet.spec und sollten in dieser einige Änderungen vornehmen. Hilfestellung geben dabei die SuSE Richtlinien.

Sind wir damit fertig, können wir noch unseren bereits aufgesetzen Server in /usr/src/packages/SOURCES/puppet-x.y-z/conf/redhat/client.sysconfig eintragen, und das Archiv wieder zusammenschnüren.

Dann erstellen wir das neue RPM und können dieses nun zur Installation nutzen:
rpmbuild -bb puppet.spec


Autoyast:

Da das Add-On Feature auf unserem SLES9 Installationsserver auf Grund von diversen Abhängigkeitsproblemen (python > 2.4, libxml2 > 2.6.26, ..) nicht funktioniert, könnte man die erstellten RPM Pakete über NFS oder HTTP exportieren und mit Hilfe eines Post Scripts installieren:

<scripts>
    <post-scripts config:type="list">
      <script>
        <filename>inst_puppet.sh</filename>
        <interpreter>shell</interpreter>
        <location></location>
        <source><![CDATA[#!/bin/bash

                cd /tmp
                wget http://server01.notjusthosting.com/software/ruby/ruby-1.8.4-17.12.i586.rpm
                wget http://server01.notjusthosting.com/software/puppet/facter-1.3.6-1.i386.rpm
                wget http://server01.notjusthosting.com/software/puppet/puppet-0.22.3-2.i586.rpm
                rpm -ihv /tmp/ruby-1.8.4-17.12.i586.rpm
                rpm -ihv /tmp/facter-1.3.6-1.i386.rpm
                rpm -ihv /tmp/puppet-0.22.3-2.i586.rpm
                cp -a /usr/lib/site_ruby/1.8/* /usr/lib/ruby/site_ruby/1.8/

]]>     </source>
      </script>
    </post-scripts>
  </scripts>

Installation Solaris10

OpenSSL muss in einer Version >= 0.9.8 installiert werden. Deswegen benötigt man ein neues Paket und muss dieses zunächst installieren. Darauf folgen Ruby, Facter und Puppet.

wget http://download.berlios.de/blastwave/csw/stable/i386/5.10/ruby-1.8.4,REV=2006.08.02-SunOS5.8-i386-CSW.pkg.gz
wget http://reductivelabs.com/downloads/packages/SunOS/CSWfacter-1.3.5-i86pc.pkg.gz
wget http://reductivelabs.com/downloads/packages/SunOS/CSWpuppet-0.22.3-i86pc.pkg.gz
wget http://download.berlios.de/blastwave/csw/stable/i386/5.10/openssl-0.9.8,REV=2006.09.29_rev=d-SunOS5.8-i386-CSW.pkg.gz
mv *.pkg.gz /tmp
gunzip openssl-0.9.8,REV=2006.09.29_rev=d-SunOS5.8-i386-CSW.pkg.gz
gunzip ruby-1.8.4,REV=2006.08.02-SunOS5.8-i386-CSW.pkg.gz
gunzip CSWfacter-1.3.5-i86pc.pkg.gz
gunzip CSWpuppet-0.22.3-i86pc.pkg.gz
pkgadd -d /tmp/openssl-0.9.8,REV=2006.09.29_rev=d-SunOS5.8-i386-CSW.pkg
pkgadd -d /tmp/ruby-1.8.4,REV=2006.08.02-SunOS5.8-i386-CSW.pkg
pkgadd -d /tmp/CSWfacter-1.3.5-i86pc.pkg
pkgadd -d /tmp/CSWpuppet-0.22.3-i86pc.pkg

bcfg2

Anforderungen

  • SLES10 (bei niedrigeren Versionen entstehen Abhängigkeitsprobleme mit Openssl)
  • python-devel (SLES10 Paket)
  • libxml2 (SLES10 Paket)
  • lxml (RPM)
  • libxslt (SLES10 Paket)
  • pyrex (RPM)
  • pyopenssl (RPM)
  • fam (SLES10 Paket)
  • python-fam (RPM)

Installation

Installiere die nötigen Pakete auf Client und Server:

yast -i fam fam-server libxml2 python python-devel
rpm -i python-fam-1.1.1-1.i586.rpm
rpm -i lxml-0.9.2-1.i586.rpm
rpm -i pyOpenSSL-0.6-1.i586.rpm
rpm -i elementtree-1.2.6_20050316-1.noarch.rpm
rpm -i bcfg2-0.9.2-0.1.noarch.rpm

Auf dem Server:

rpm -i bcfg2-server-0.9.2-0.1.noarch.rpm

Kopiere die Konfiguration:

mkdir /etc/bcfg2
cp ~/src/bcfg2/bcfg2-0.9.2/examples/* /etc/bcfg2

Lege das Repository an:

mkdir /home/fp/bcfg2

Hinweis: Nicht sicher warum, aber SLES10 schreibt bei der Installation in die /etc/hosts einen Eintrag der den Hostnamen auf 127.0.0.2 verlinkt. Somit lauscht der Daemon auch nur auf der localhost IP und ist nicht für den Client erreichbar. Wird dieser Eintrag auskommentiert, funktioniert die Kommunikation problemlos. Gleiches "Problem" bei OpenSuSE 10.

Starte FAM und den Server:

bcfg2-admin init
/etc/init.d/fam start
/etc/init.d/bcfg2-server start
bcfg2-info (in seperate console)

Füge den Eintrag (localhost) zu /home/fp/bcfg2/Metadata/clients.xml hinzu. In bcfg2-info:

update

Beende bcfg2-info und starte bcfg2:

bcfg2 -q -v -n

Hinweis: Erscheint beim Starten des Clients die Meldung:

ImportError: No module named Bcfg2.Options

dann bedeutet das, dass Python das Modul nicht findet. Bei mir wurde es in den Ordner /usr/lib64/python2.4/site-packages/Bcfg2 installiert. Nachdem ich diesen Ordner nach /usr/lib/python2.4/site-packages verlinkt habe und dort eine Datei Bcfg2.pth angelegt habe, die "Bcfg2" enthält, funktioniert der Import problemlos.


Anwendung

cfengine

sudo

Neue Datei sudo.cf:

control:
    actionsequence = ( files )
files:
    /usr/bin/sudo owner=root group=root mode=4111 checksum=md5 action=fixall
    /etc/sudoers owner=root group=root mode=0440 action=fixall

Konfigurationsprozess:

/usr/local/sbin/cfagent -vf /home/fp/cfengine/sudo.cf


puppet

filserver

Zur Datei /etc/puppet/fileserver.conf hinzufügen, falls nicht vorhanden:

[files]
    path /etc/puppet/configfiles
    allow 192.168.0.0/24
    allow *.notjusthosting.com

Nun können wir dort eine Datei hinkopieren, die dann vom Client geholt wird:

cp /etc/motd /etc/puppet/configfiles/motd
cp /etc/ldap.conf /etc/puppet/configfiles/ldap.conf
cp /etc/nsswitch.conf /etc/puppet/configfiles/nsswitch.conf

Je nachdem wie die Sektion in der fileserver.conf Datei benannt wurde (in diesem Beispiel schlicht files), muss auch der Pfad in source angepasst werden. Beim nächsten Neuaufruf des Clients zieht dieser sich die motd vom Server.

hauptmanifest

# site.pp
 
# set server name to get files from
$server = "server01.notjusthosting.com"
 
# import manifests
import "client.pp"
 
#
# configuration files
#
file {
        # usual system files and the perms
        "/etc/sudoers": owner => root, group => root, mode => 440;
        "/etc/passwd": owner => root, group => root, mode => 440;
        "/etc/shadow": owner => root, group => root, mode => 440;
}
 
#
# nodes that are to be served
#
node server02 {
        include ldap-client
        include motd
}
 
node server03 {
        include motd
}

clients.pp

class ldap-client {
 
        #
        # ldap user management files
        #
        file {
                "/etc/ldap.conf": owner => root, group => root, mode => 440, source => "puppet://$server/files/ldap.conf", checksum => md5;
                "/etc/security/access.conf": owner => root, group => root, mode => 440, source => "puppet://$server/files/access.conf_admins";
                "/etc/pam.d/sshd": owner => root, group => root, mode => 440, source => "puppet://$server/files/pamd_sshd";
                "/etc/pam.d/common-session": owner => root, group => root, mode => 440, source => "puppet://$server/files/common-session";
                "/etc/nsswitch.conf": owner => root, group => root, mode => 440, source => "puppet://$server/files/nsswitch.conf";
        }
 
        #
        # packages
        #
        $pam_ldap = $operatingsystem ? {
                default => pam_ldap
        }
 
        $nss_ldap = $operatingsystem ? {
                default => nss_ldap
        }
 
        package {
                $pam_ldap: ensure => installed, alias => pam_ldap;
                $nss_ldap: ensure => installed, alias => nss_ldap;
        }
 
}
 
 
class motd {
 
        #
        # motd
        #
        file {
                "/etc/motd": owner => root, group => root, mode => 440, source => "puppet://$server/files/motd";
        }
}

bcfg2

motd

Bearbeite /home/fp/bcfg2/Metadata/groups.xml und füge folgendes hinzu:

<Bundle name='motd'/>

Bearbeite /home/fp/bcfg2/Bundler/motd.xml und füge folgendes hinzu:

<Bundle name='motd' version='2.0'>
    <ConfigFile name='/etc/motd' />
</Bundle>

Auf dem Server:

mkdir /home/fp/bcfg2/Cfg/etc
mkdir /home/fp/bcfg2/Cfg/etc/motd
cp /etc/motd /home/fp/bcfg2/Cfg/etc/motd/

Auf dem Client:

bcfg2 -q -v

Quellen

Personal tools