Konfigurationsmanagement
From NJH-Wiki
- 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 überwget http://reductivelabs.com/downloads/rpm/SRPMS/puppet-0.22.3-1.src.rpm rpm -i puppet-0.22.3-1.src.rpmzu 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

