Dans ce court article, je vous propose de découvrir comment avec Puppet, il est simple de déployer un serveur Web complet prêt à accueillir une application web depuis son dépôt GIT. Je vais prendre pour exemple le célèbre CMS WordPress.
Premièrement, on installe les modules dont on aura besoin :
puppet module install puppetlabs-apache --version 2.3.0 puppet module install puppetlabs-mysql --version 5.1.0 puppet module install puppetlabs-vcsrepo
Partons sur une simple définition de node dans le fichier /etc/puppetlabs/code/environments/production/manifests/site.pp contenant notre serveur web. On installe Apache avec le moteur prefork et non pas worker fourni par défaut car on souhaite installer mod_php. Enfin on créé un VirtualHost www.morot.test dont les fichiers seront dans le répertoire /srv/www :
node 'www' {
class { 'apache':
default_vhost => false,
mpm_module => prefork,
}
class { 'apache::mod::php': }
apache::vhost { 'www.morot.test':
port => '80',
docroot => '/srv/www/',
}
}
On ajoute ensuite le serveur MySQL avec les modules php pour mysql :
class { '::mysql::server':
root_password => 'secret',
remove_default_accounts => true,
}
class { 'mysql::bindings::php': }
Nous avons ensuite besoin d’une base de données dédiée pour notre WordPress, nous allons la créé avec un compte autorisé à y accéder. Le mot de passe est encodé au format de hash de la commande MySQL PASSWORD(‘secret’); :
mysql_database { 'wordpress':
ensure => 'present',
charset => 'utf8',
collate => 'utf8_general_ci',
}
mysql_user { 'wordpress@localhost':
ensure => 'present',
password_hash => '*14E65567ABDB5135D0CFD9A70B3032C179A49EE7'
}
mysql_grant { 'wordpress@localhost/wordpress.*':
ensure => 'present',
options => ['GRANT'],
privileges => ['ALL'],
table => 'wordpress.*',
user => 'wordpress@localhost',
}
L’ensemble des bases de données seront sauvegardées tous les jours à 02:10 et conservées sept jours. Le script est fourni par le module Puppet.
class { 'mysql::server::backup':
backupuser => 'backup',
backuppassword => 'secret',
backupdir => '/srv/mysqlbackups',
backupcompress => true,
backuprotate => 7,
file_per_database => true,
time => ['2','10']
}
Enfin, il ne nous reste plus qu’à récupérer les sources de notre application depuis le dépôt, pour une version taillée pour un développeur il serait possible de prendre la branche master.
vcsrepo { '/srv/www':
ensure => latest,
provider => git,
source => 'https://github.com/WordPress/WordPress.git',
revision => '4.8-branch',
}
Nous avons terminé, pour aller au bout des choses, il faudrait pousser un wp-config.php depuis un template Puppet et injecter le SQL modèle lors de la création de la base. En version complète notre manifeste donne :
node 'www' {
class { 'apache':
default_vhost => false,
mpm_module => prefork,
}
class { 'apache::mod::php': }
apache::vhost { 'www.morot.test':
port => '80',
docroot => '/srv/www/',
}
class { '::mysql::server':
root_password => 'secret',
remove_default_accounts => true,
}
class { 'mysql::bindings::php': }
mysql_database { 'wordpress':
ensure => 'present',
charset => 'utf8',
collate => 'utf8_general_ci',
}
mysql_user { 'wordpress@localhost':
ensure => 'present',
password_hash => '*14E65567ABDB5135D0CFD9A70B3032C179A49EE7'
}
mysql_grant { 'wordpress@localhost/wordpress.*':
ensure => 'present',
options => ['GRANT'],
privileges => ['ALL'],
table => 'wordpress.*',
user => 'wordpress@localhost',
}
class { 'mysql::server::backup':
backupuser => 'backup',
backuppassword => 'secret',
backupdir => '/srv/mysqlbackups',
backupcompress => true,
backuprotate => 7,
file_per_database => true,
time => ['2','10']
}
vcsrepo { '/srv/www':
ensure => latest,
provider => git,
source => 'https://github.com/WordPress/WordPress.git',
revision => '4.8-branch',
}
}

Merci pour cette introduction à Puppet, ça va grandement me faciliter la vie et c’est beaucoup plus simple d’administrer un serveur LAMP ainsi !