Puppet : déployer automatiquement une applications Web avec les services Apache/PHP/MySQL

Posted by

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',
  }
}

2 comments

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

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *