XHTML.net

Technology talks by Loïc d’Anterroches

News, articles, PHP, scripts, XHTML/CSS, …

  1. Home
  2. News

Puppet, long mais satisfaisant

The 2008-02-07 at 13:50 by Loïc d'Anterroches filed under News.

C’est long, c’est très long d’écrire les recettes pour Puppet, mais au final c’est satisfaisant de savoir que l’on ne fait les choses qu’une fois et que par la suite il est facile de dupliquer ou mettre à jour un serveur très facilement.

Voici par exemple une recette pour PostgreSQL (il peut certainement y avoir des erreurs dedans) :

class postgresql {

       package { "postgresql-8.2": ensure => installed }

       group {"postgres":
             ensure => present,
             require => Package["postgresql-8.2"],
       }

       user {"postgres":
             ensure => present,
             require => Group["postgres"],
       }    

       # Init the pgdata directory
       file {"/home/pgdata":
             owner => "postgres",
             group => "postgres",
             ensure => directory,
             require => User["postgres"],
       }

       file {"/home/pgdata/main":
             owner => "postgres",
             group => "postgres",
             ensure => directory,
             require => File["/home/pgdata"],
       }

       exec {"initdb":
             command => "/usr/lib/postgresql/8.2/bin/initdb -D /home/pgdata/main -E UTF-8",
             group => "postgres",
             user => "postgres",
             creates => "/home/pgdata/main/base",
             require => File["/home/pgdata/main"],
       }

       # Symlink the new pgdata directory correctly
       file {"/etc/postgresql/8.2/main/pgdata":
             ensure => "/home/pgdata/main",
             require => Exec["initdb"],
       }       

       # Get the configuration file
       file {"/etc/postgresql/8.2/main/postgresql.conf":
             owner => "postgres",
             group => "postgres",
             mode  => 644,
             source => "puppet://puppet/files/postgresql.conf",
             require => File["/etc/postgresql/8.2/main/pgdata"],
       }

       file {"/etc/postgresql/8.2/main/pg_hba.conf":
             owner => "postgres",
             group => "postgres",
             mode  => 644,
             source => "puppet://puppet/files/pg_hba.conf",
             require => File["/etc/postgresql/8.2/main/pgdata"],
       }

       service {"postgresql-8.2":
               ensure => running,
               enable => true,
               # check for the main cluster here
               pattern => "/usr/lib/postgresql/8.2/bin/postgres -D /home/pgdata/main -c config_file=/etc/postgresql/8.2/main/postgresql.conf",
               require => User["postgres"],
               subscribe => [File["/etc/postgresql/8.2/main/pgdata"],
                             File["/etc/postgresql/8.2/main/postgresql.conf"],
                             File["/etc/postgresql/8.2/main/pg_hba.conf"],
                             Package["postgresql-8.2"]
                            ],
       }

       service {"postgresql-8.2-old":
               ensure => stopped,
               pattern => "/usr/lib/postgresql/8.2/bin/postgres -D /var/lib/postgresql/8.2/main -c config_file=/etc/postgresql/8.2/main/postgresql.conf",
               require => User["postgres"],
               before => Exec["initdb"],
               provider => base,
               subscribe => Package["postgresql-8.2"],
       }
}

Cette recette assure que le paquet de postgresql est installé et fait quelques accrobaties pour changer la position des données de /var/lib vers /home/pgdata. Ce sont ces accrobaties qui prennent du temps à définir car il faut qu’elles fonctionnent quelque soit le niveau d’installation du serveur. Par exemple, si initdb a déjà été lancé, il ne faut pas le relancer, etc…

Notez que la configuration est stockée sur mon serveur puppet, cela veut dire que si je mets à jour la configuration sur le serveur central puppet, mon serveur commandé va se mettre à jour automatiquement et redémarrer postgresql tout aussi automatiquement.

Comments from readers

Voice your ideas

It is painless and I try not to kill electrons in the process.


Your email is required but will not be shared nor displayed.


Do you think your comment will force me to write even better stuff next time? If so, you simply rock.


Logo of Plume CMS