J’installais jusqu’à aujourd’hui des paquets debian avec puppet à condition que ceux-ci n’aient pas de configuration interactive lors de l’installation. Cela limitait sérieusement le nombre de paquets que j’étais en mesure d’installer par l’intermédaire de puppet. Impossible par exemple d’installer un serveur mysql, ou samba, pour qui il est nécessaire de répondre à des questions. La solution est relativement simple, puisqu’elle consiste à utiliser le concept de preseeding de debian dans puppet.
Si vous ne connaissez pas le preseeding, explication rapide, c’est relativement simple: l’outil debconf-set-selections du paquet debconf-utils permet de charger les réponses aux questions avec l’installation depuis un fichier plat:
debconf-set-selections < mysql-server.preseed
apt-get install mysql-server
Le format est relativement simple, et une recherche google vous permet de retrouver pour de nombreux paquets la meilleur configuration.
J’ai par conséquent écrit la classe suivante permettant de réaliser les deux opérations ci-dessous dans puppet:
class install {
# je crée une classe me permettant d'installer des paquets.
file { "/etc/apt/sources.list":
# le fichier sources.list utile pour pointer sur les repo. Attention, il est nécessaire dans mon exemple de pointer sur le repo backport de lenny
mode => "644",
owner => root,
group => root,
source => "puppet://$fileserver/$environment/etc/apt/sources.list"
}
define pkginstall ($pkgname,$preseed='no')
# la fonction pkginstall est en charge de l'installation, avec pour parametre, le nom du paquet et le preseeding oui ou non. Par défaut, c'est non.
{
case $preseed {
yes: {
#si c'est oui, on appelle la fonction preseed_package
preseed_package { "$pkgname": }
# et on installe en prenant par défaut le paquet de backport
exec { "install_$pkgname":
command => "apt-get update && sudo apt-get -t lenny-backports -y install $pkgname",
path => "/bin:/usr/bin/:/usr/sbin",
timeout => "-1",
require => Exec["debconf-set-selections_$pkgname"]
}
}
no: {
# si c'est non, c'est de l'install simple de backport
exec { "install_$pkgname":
command => "apt-get update && sudo apt-get -t lenny-backports -y install $pkgname",
path => "/bin:/usr/bin/:/usr/sbin",
timeout => "120",
}
}
}
}
define preseed_package () {
file { "/var/local/preseed":
ensure => directory,
}
file { "/var/local/preseed/$name.preseed":
# le fichier de preseeding est installé dans /var/local/preseed/ avec comme format nomdepaquet.preseed, mysql-server.preseed, par exemple.
source => "puppet://$fileserver/$environment/var/local/preseed/$name.preseed",
mode => "644",
owner => root,
group => root,
}
exec { "debconf-set-selections_$name" :
# le fichier de preseed est utilisé avec debconf-set-selections, la commande issue du paquet debconf-utils permettant de charger le preseed.
command => "debconf-set-selections < /var/local/preseed/$name.preseed", require => [Exec["install_debconf-utils"],File["/var/local/preseed/$name.preseed"]],
path => "/bin:/usr/bin/:/usr/sbin",
}
}
}
Comment l’utiliser maintenant?
Sur mes machines, en général, j’installe les deux premiers paquets rsync et debconf-utils, ce qui me donne, à titre d’exemple, une classe d’install de base:
class baseinstall {
install::pkginstall {
"rsync":
pkgname => "rsync";
"debconf-utils":
pkgname => "debconf-utils";
}
}
Ensuite, prenons l’exemple d’un serveur http sous apache et mysql-server. Vous pourrez noter que la plupart des packages sont installés sans preseeding, excepté mysql-server.
class http {
install::pkginstall {
"apache2":
pkgname => "apache2";
"mysql-server":
pkgname => "mysql-server",
preseed => "yes";
"php5":
pkgname => "php5";
"php-pear":
pkgname => "php-pear";
"php5-cli":
pkgname => "php5-cli";
"php5-gd":
pkgname => "php5-gd";
"php5-mysql":
pkgname => "php5-mysql";
"php5-mcrypt":
pkgname => "php5-mcrypt";
"memcached":
pkgname => "memcached";
"php5-memcache":
pkgname => "php5-memcache";
}
Le fichier /var/local/preseed/mysql-server.preseed sera placé dans votre serveur de fichier de l’environnement puppet utilisé.
mysql-server mysql-server/root_password select
mysql-server-5.1 mysql-server/root_password_again password PASS
mysql-server-5.1 mysql-server/root_password password PASS
mysql-server-5.1 mysql-server/error_setting_password error
mysql-server mysql-server/root_password select PASS
mysql-server mysql-server/root_password_again select PASS
mysql-server-5.1 mysql-server-5.1/start_on_boot boolean true
mysql-server-5.1 mysql-server-5.1/postrm_remove_databases booleanfalse
mysql-server-5.1 mysql-server-5.1/nis_warning note
mysql-server-5.1 mysql-server-5.1/really_downgrade boolean false
mysql-server-5.1 mysql-server/password_mismatch error
mysql-server-5.1 mysql-server/no_upgrade_when_using_ndb error
En espérant que cela vous aidera.
Ciao