Un module puppet d’installation pour paquet debian avec preseeding

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

Posted in admin, mysql. Bookmark the permalink. RSS feed for this post. Leave a trackback.

2 Responses to Un module puppet d’installation pour paquet debian avec preseeding

  1. Nico says:

    Pourquoi ne pas utiliser la propriété responsefile du type package ?

    • stephbul says:

      Hello Nico,
      Merci pour ton commentaire, la réponse est simple, je suis passé à côté de la propriété. Je la découvre avec ton commentaire et je ne m’explique pas comment j’ai pu raté cela la semaine dernière.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Protected by WP Anti Spam

Swedish Greys - a WordPress theme from Nordic Themepark.