Centre de Ressources Informatiques Université Paul Verlaine - Metz Ile du Saulcy BP 80794 57012 Metz Cedex 1
Accès rapide
Avoir un compte
Messagerie
Wifi 
31 : 8 [CriNET] FERME perturbations internet
27 : 8 [CriNET] INFO Coupure téléphone
17 : 8 [CriNET] FERME Coupure Internet
16 : 8 [CriNET] INFO Coupure Internet
S'abonner au flux RSS
Mises à jour du site de l'UPV-M
Metzuniversité : journal trimestriel de l'UPV-M
Cours de langues étrangères pour adultes
Le service formation continue de l'UFR Lettres & langues ...
Les sciences sur la place 2010
Mardi 14 septembre 2010
Monsieur Namupot Mas MUMBAL IKIE est autorisé à soutenir ...
Tickets CRINet
2010082700INFO
Coupure téléphone
2010082701FERME
perturbations internet
2010081600INFO
Coupure Internet
2010080200FERME
Coupure Internet

Puppet: administration centralisée serveurs

...A compléter ...

Puppet, cfengine, bcfg2

\CfengineBcfg2Puppet
LangageCPythonRuby
ArchitectureClient-ServeurClient-ServeurClient-Serveur
Connexionsbi-clé sshxml-rpc/sslxml-rpc/html/ssl
No. max clientsilimité?30 (extensible avec Mongrel)
Liens rapidesQuick-StartQuick startGuide install.


Tous les 3 fonctionnent sur le même principe: un serveur maître envoi aux clients spécifiées et autorisés, les actions à
exécuter (démarrer de services, installer/mettre à jour de paquets, exécuter de scripts, ...).
Ces actions sont exécutées par le machines clients et, en retour, le maître peut recevoir de logs sur l'état d'exécution.

Puppet et Bcfg2 intègrent, beaucoup plus des fonctionnalités spécifiques à l'administration système et bénéficient de nombreux
apports de la communauté du libre.


Lien puppet/cfengine - Cfengine vs. Puppet

Objectif principal – automatiser les mises à jour système:


  • Debian/Ubuntu: apt-get update && apt-get upgrade
  • RedHat: up2date
  • Fedora: yum


Installation Puppet (Debian Etch)


Les paquets puppet et puppetmaster, pour etch sont trop anciens. En Ubuntu stable (hardy) la version actuelle est: 0.24.4-3

On peut installer une version de Debian testing (lenny) sans passer le système entier à lenny - on modifie les priorités
dans /etc/apt/preferences:

# 1. Edit /etc/apt/preferences and add the following lines:
Package: *
Pin: release a=testing
Pin-Priority: 1

Package: puppet
Pin: release a=testing
Pin-Priority: 1001

Package: puppetmaster
Pin: release a=testing
Pin-Priority: 1001


# 2. Edit /etc/apt/sources.list and add the following lines (change the mirror to your own localized mirror): 
deb http://ftp.fr.debian.org/debian/ testing main


# 3. Edit /etc/apt/apt.conf.d/release and add: 
APT::Default-Release "stable";


# 4. Do a "apt-get update" and "apt-get install puppet puppetmaster"

Dépendances Puppet:


ruby, irb, ri, rdoc, libxmlrpc-ruby, libopenssl-ruby, libstrscan-ruby, libsyslog-ruby, libwebrick-ruby

Test sur 2 machines (serveur maitre Debian Etch, client Ubuntu)

Configuration globale: /etc/puppet:


Pour le serveur maitre:


- modifier puppet.conf, fileserver.conf
cp /etc/puppet/puppet.conf /etc/puppet.conf.orig

cat puppet.conf.orig 
[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
pluginsync=true

[puppetmasterd]
templatedir=/var/lib/puppet/templates


La config par defaut peut suffire si on a pu ajouté un alias DNS pour le nom de la machine maitre ( CNAME puppet). Sinon, ajouter:
...
[puppetd]
#le nom machine
server = maitre.univ-metz.fr



- démarrage du maître: /etc/init.d/puppetmaster

Pour la machine client



(le plus important c'est le nom de la machine maître)

modifier /etc/puppet/puppet.conf
~# cat /etc/puppet/puppet.conf 
[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
pluginsync=true
server=maitre.univ-metz.fr
report=true

Dans ma config. serveur, je rajoute:


  • le stockage dans une base mysql nommé puppet (ça peut etre aussi postgres ou sqlite3)
  • l'envoi de mail avec l'option tagmail
  • pour mysql il installer libmysql-ruby
  • #cat puppet.conf
    ### Config. sur la machine maitre
    
    [main]
    ### Config. commune pour puppetmaster et puppetd(daemon client)
    ### On peut installer et faire tourné un client (puppetd) sur la machine maitre, aussi 
    logdir=/var/log/puppet
    ....
    
    [puppetmasterd]
    # config. specifique au daemon puppetmaster
    templatedir=/etc/puppet/templates
    ....
    
    # stockage database
    # de http://reductivelabs.com/trac/puppet/wiki/UsingStoredConfiguration
    storeconfigs=true
    dbadapter = mysql
    dbuser = puppet
    dbpassword = puppet #le mot de passe de la base crée avec mysql
    dbserver = localhost
    dbsocket = /var/run/mysqld/mysqld.sock
    # fin ajout stockage database
    
    
    [puppetd]
    ### config. specifique au daemon client (puppetd)
    server = maitre.univ-metz.fr
    ....
    



Fileserver


Pour distribuer de fichiers (templates, modules, ...) aux clients avec le serveur interne de puppet, on configure fileserver.conf:

# This file consists of arbitrarily named sections/modules
# defining where files are served from and to whom

# Define a section 'files'
# Adapt the allow/deny settings to your needs. Order
# for allow/deny does not matter, allow always takes precedence
# over deny
[files]
  path /etc/puppet/files
#  allow 192.168.0.0/24
  allow *.interne.upvm
  allow 127.0.0.0/8
  allow arwen.univ-metz.fr

##[plugins]
#  allow *.example.com
#  deny *.evil.example.com
#  allow 192.168.0.0/24
##  allow 195.220.226.35/27

[modules]
  allow *.interne.univ-metz.fr
  allow 127.0.0.0/8
  allow maitre.univ-metz.fr

[common]
 path /var/lib/puppet/modules/common
 allow *.interne.univ-metz.fr
 allow 127.0.0.0/8
 allow maitre.univ-metz.fr

[apt]
 path /var/lib/puppet/modules/apt
 allow *.interne.univ-metz.fr
 allow 127.0.0.0/8
 allow maitre.univ-metz.fr


Common et Apt


Le sections common] et [apt] corresponds au deux modules ([ site git: de David Schmitt )  utilisés pour les mises à jour automatiques des paquets.
Les explications pour le téléchargement et la configuration complète sont ici.
ici.
J'utilise uniquement les modules common et apt:
# common prerequisite
$ git clone git://git.black.co.at/module-common /etc/puppet/modules/common
# module: apt-get update
$ git clone git://git.black.co.at/module-apt /etc/puppet/modules/apt

Ajouter apt-get dselect upgrade


Modifier /etc/puppet/modules/apt/manifests/init.pp

#cat 
# apt.pp - common components and defaults for handling apt
# Copyright (C) 2007 David Schmitt <david@schmitt.edv-bus.at>
# See LICENSE for the full license granted to you.
#
# With hints from
#  Micah Anderson <micah@riseup.net>
#  * backports key

class apt {
    
        schedule { maint:
        range => "17 - 20",
        period => daily,
        repeat => 1
        }

        # See README
        $real_apt_clean = $apt_clean ? {
                '' => 'auto',
                default => $apt_clean,
        }

        package {
                [apt, dselect, lsb-release]: ensure => installed,
        }

        # a few templates need lsbdistcodename
        include assert_lsbdistcodename

        case $custom_sources_list {
                '': {
                        include default_sources_list
                }
                default: {
                        config_file { "/etc/apt/sources.list":
                                content => $custom_sources_list
                        }
                }
        }

	class default_sources_list {
		config_file {
			# include main, security and backports
			# additional sources could be included via an array
			"/etc/apt/sources.list":
				###content => template("apt/sources.list.erb"),
				content => template("apt/sources.list$lsbdistcodename.erb"),
				require => Exec[assert_lsbdistcodename];
		}
	}

	config_file {
		# this just pins unstable and testing to very low values
		"/etc/apt/preferences":
			content => template("apt/preferences$lsbdistcodename.erb"),
			# use File[apt_config] to reference a completed configuration
			# See "The Puppet Semaphor" 2007-06-25 on the puppet-users ML
			alias => apt_config,
			# only update together
			require => File["/etc/apt/sources.list"];
		# little default settings which keep the system sane
		"/etc/apt/apt.conf.d/from_puppet":
			content => "APT::Get::Show-Upgraded true;\nDSelect::Clean $real_apt_clean;\n",
			before => File[apt_config];
	}

	$apt_base_dir = "/etc/puppet/modules/apt"
	modules_dir { apt: }
	# watch apt.conf.d
	file { "/etc/apt/apt.conf.d": ensure => directory, checksum => mtime; }

	# suppress annoying help texts of dselect
	line { dselect_expert:
		file => "/etc/dpkg/dselect.cfg",
		line => "expert",
		ensure => present,
	}

	exec {
		# "&& sleep 1" is workaround for older(?) clients
		"/usr/bin/dselect update && sleep 1 #on refresh":
			refreshonly => true,
			subscribe => [ File["/etc/apt/sources.list"],
				File["/etc/apt/preferences"], File["/etc/apt/apt.conf.d"],
				File[apt_config] ];
		"/usr/bin/dselect update && /usr/bin/apt-get autoclean #hourly":
			require => [ File["/etc/apt/sources.list"],
				File["/etc/apt/preferences"], File[apt_config] ],
			# Another Semaphor for all packages to reference
			alias => apt_updated;
	}

	case $lsbdistcodename {
		etch: {
			## This package should really always be current
			package {
				[ "debian-archive-keyring", "debian-backports-keyring" ]:
					ensure => latest,
				}

			# This key was downloaded from
			# http://backports.org/debian/archive.key
			# and is needed to bootstrap the backports trustpath
			file { "${apt_base_dir}/backports.org.key":
				source => "puppet://$servername/apt/backports.org.key",
				mode => 0444, owner => root, group => root,
			}
			exec { "/usr/bin/apt-key add ${apt_base_dir}/backports.org.key && dselect update":
				alias => "backports_key",
				refreshonly => true,
				subscribe => File["${apt_base_dir}/backports.org.key"],
				before => [ File[apt_config], Package["debian-backports-keyring"] ]
			}
		}
		hardy: {
			## This package should really always be current
			## J'utilise aussi le depot medibuntu=> medibuntu-keyring
			package {
				###[ "ubuntu-keyring", "medibuntu-keyring" ]:
				[ "ubuntu-keyring" ]:
					ensure => latest,
				}
			## Si necessaire ajouter backport et la cle
		}
	}
	#Exec[apt_updated]: After this point, current packages can installed via apt,
        #	usually used like this:
        	###Package { require => Exec[apt_updated] }
		exec { "/usr/bin/apt-get -s  dselect-upgrade > /root/dselect-upgrade.simulate":
				require => Exec[apt_updated], 
				alias => apt_to_upgrade;
		}

		exec { "/usr/bin/apt-get dselect-upgrade":
				require => Exec[apt_to_upgrade], 
				alias => apt_upgraded,
		}

		exec { "/bin/date > /root/motd;
/bin/echo PUPPETD - ATTENTION INTERVENTION ROOT NECESSAIRE pour APT-GET UPGRADE >> /root/motd": 
			    tag => dselect_upgraded,
			    logoutput => true,
		            unless => "/usr/bin/test 'Exec[apt_upgraded]' != 'executed successfully'";
                }
        
        # Pour forcer la mise a jour, apres test,
faites d'abord un touch sur le serveur du fichier "really_upgrade"
        file {"${apt_base_dir}/really_upgrade":
            source => "puppet://$servername/apt/really_upgrade",
        }
        exec { "/usr/bin/apt-get -y dselect-upgrade":
            refreshonly => true,
            subscribe => File["${apt_base_dir}/really_upgrade"],
        }

}

Démarrage


Le client demande le certificat:

client# puppetd --waitforcert 30 --server puppetserver.domain.net -v


Le serveur:
- affiche les demandes de certificats:

serveur# puppetca --list


- signe le certificat pour ce client:
serveur# puppetca --sign client.univ-metz.fr

Démarrage en production


serveur# /etc/init.d/puppetmaster start

client# /etc/init.d/puppetd start

...A compléter ...