Puppet : déployer automatiquement une applications Web avec les services Apache/PHP/MySQL
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', } }