Tutorial

Comment utiliser Ansible pour installer et configurer WordPress avec LAMP sur Ubuntu 18.04

PHPWordPressLAMP StackAnsibleAutomated Setups

Introduction

L'automatisation des serveurs joue maintenant un rôle essentiel dans l'administration des systèmes, en raison de la nature disponible des environnements d'application modernes. Les outils de gestion de la configuration tels qu'Ansible sont généralement utilisés pour rationaliser le processus d'automatisation de la configuration des serveurs en établissant des procédures standard pour les nouveaux serveurs, tout en réduisant l'erreur humaine associée aux configurations manuelles.

Ansible offre une architecture simple qui ne nécessite pas l'installation de logiciels spéciaux sur les nœuds. Elle fournit également un ensemble robuste de caractéristiques et de modules intégrés qui facilitent l'écriture de scripts d'automatisation.

Ce guide explique comment utiliser Ansible pour automatiser les étapes contenues dans notre guide sur Comment installer WordPress avec LAMP sur Ubuntu 18.04. WordPress est le CMS (système de gestion de contenu) le plus populaire sur Internet, qui permet aux utilisateurs de créer des blogs et des sites web flexibles en plus d'un backend MySQL avec traitement PHP. Une fois WordPress configuré, presque toute l'administration peut se faire via l'interface Web.

Conditions préalables

Afin d'exécuter la configuration automatisée fournie par le playbook dont nous parlons dans ce guide, vous aurez besoin :

Avant de poursuivre, vous devez d'abord vous assurer que votre nœud de contrôle Ansible est capable de connecter et d'exécuter des commandes sur votre ou vos hôtes Ansible. Pour réaliser un test de connexion, veuillez vérifier l'étape 3 de Comment installer et configurer Ansible sur Ubuntu 18.04.

Que fait ce Playbook ?

Ce playbook Ansible offre une alternative à la gestion manuelle via la procédure décrite dans notre guide sur Comment WordPress avec LAMP sur Ubuntu 18.04.

L'exécution de ce playbook exécutera les actions suivantes sur vos hôtes Ansible :

  1. Installation d’aptitude, qui est préférée par Ansible comme une alternative au gestionnaire de paquets apt.
  2. Installation des packages LAMP et des extensions PHP requis.
  3. Création et validation d'un nouveau VirtualHost Apache pour le site WordPress.
  4. Activation du module de réécriture Apache (mod_rewrite).
  5. Désactivation du site web Apache par défaut.
  6. Définit le mot de passe pour l'utilisateur root de MySQL.
  7. Suppression des comptes MySQL anonymes et de la base de données test.
  8. Création d'une nouvelle base de données MySQL et d'un utilisateur pour le site WordPress.
  9. Configuration du paramètre UFW pour autoriser le trafic HTTP sur le port configuré (80 par défaut).
  10. Téléchargez et décompactez WordPress.
  11. Définissez la propriété et les autorisations correctes du répertoire.
  12. Définissez le fichier wp-config.php en utilisant le modèle fourni.

Une fois le Playbook exécuté, vous aurez une installation WordPress fonctionnant au-dessus d'un environnement LAMP, basée sur les options que vous avez définies dans vos variables de configuration.

Comment utiliser ce Playbook

La première chose que nous devons faire est d'obtenir le playbook WordPress sur LAMP et ses dépendances à partir du répertoire do-community/ansible-playbooks Nous devons cloner ce répertoire vers un dossier local à l'intérieur du nœud de contrôle Ansible.

Si vous avez déjà cloné ce répertoire en suivant un autre guide, accédez à votre copie existante de ansible-playbooks et lancez une commande git pull pour vous assurer que vous disposez d'un contenu mis à jour :

  • cd ~/ansible-playbooks
  • git pull

Si c'est la première fois que vous utilisez le répertoire do-community/ansible-playbooks, vous devez commencer par cloner le répertoire vers votre dossier d'accueil avec :

  • cd ~
  • git clone https://github.com/do-community/ansible-playbooks.git
  • cd ansible-playbooks

Les fichiers qui nous intéressent sont situés à l'intérieur du dossier wordpress-lamp_ubuntu1804, qui a la structure suivante :

wordpress-lamp_ubuntu1804
├── files
│   ├── apache.conf.j2
│   └── wp-config.php.j2
├── vars
│   └── default.yml
├── playbook.yml
└── readme.md

Voici ce à quoi correspondent chacun de ces fichiers :

  • files/apache.conf.j2 : fichier template pour la création du VirtualHost Apache
  • files/wp-config.php.j2: fichier template pour la création du fichier de configuration de WordPress.
  • vars/default.yml : fichier variable pour la personnalisation des paramètres playbook
  • playbook.yml : le fichier playbook, contenant les tâches à exécuter sur le(s) serveur(s) distant(s)
  • readme.md : un fichier texte contenant des informations sur ce playbook

Nous allons modifier le fichier variable du playbook pour personnaliser ses options. Accédez au répertoire wordpress-lamp_ubuntu1804 et ouvrez le fichier vars/default.yml en utilisant l'éditeur en ligne de commande de votre choix :

  • cd wordpress-lamp_ubuntu1804
  • nano vars/default.yml

Ce fichier contient quelques variables qui nécessitent votre attention :

vars/default.yml
---
#System Settings
php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]

#MySQL Settings
mysql_root_password: "mysql_root_password"
mysql_db: "wordpress"
mysql_user: "sammy"
mysql_password: "password"

#HTTP Settings
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"

La liste suivante contient une brève explication de chacune de ces variables et la façon dont vous pourriez vouloir les modifier :

  • php_modules : un réseau contenant des extensions PHP qui doit être installé pour supporter votre configuration WordPress. Vous n'avez pas besoin de modifier cette variable, mais vous pourriez vouloir inclure de nouvelles extensions sur la liste si votre configuration spécifique l'exige.
  • mysql_root_password : le mot de passe souhaité pour le compte root MySQL
  • mysql_db : le nom de la base de données MySQL qui doit être créée pour WordPress.
  • mysql_user : le nom de l'utilisateur MySQL qui doit être créé pour WordPress.
  • mysql_password : le mot de passe pour le nouvel utilisateur MySQL.
  • http_host : votre nom de domaine
  • http_conf :le nom du fichier de configuration qui sera créé au sein d'Apache
  • http_port : port HTTP pour cet hôte virtuel, où 80 est celui par défaut

Une fois que vous avez terminé la mise à jour des variables à l'intérieur de vars/default.yml, enregistrez et fermez ce fichier Si vous avez utilisé nano, faites-le en appuyant sur CTRL+X, Y, puis ENTER.

Vous êtes maintenant prêt à exécuter ce playbook sur un ou plusieurs serveurs. La plupart des playbooks sont configurés pour être exécutés sur chaque serveur de votre répertoire, par défaut. Nous pouvons utiliser le drapeau -l pour nous assurer qu'un seul sous-ensemble de serveurs, ou un seul serveur, est affecté par le playbook. Nous pouvons également utiliser le drapeau -u pour spécifier quel utilisateur du serveur distant nous utilisons pour nous connecter et exécuter les commandes du playbook sur les hôtes distants.

Pour exécuter le playbook uniquement sur server1, connecté en tant quesammy, vous pouvez utiliser la commande suivante :

  • ansible-playbook playbook.yml -l server1 -u sammy

Vous obtiendrez une sortie similaire à ceci :

Output
PLAY [all] ***************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [server1] TASK [Install prerequisites] *********************************************************************************************************** ok: [server1] … TASK [Download and unpack latest WordPress] ******************************************************************************************** changed: [server1] TASK [Set ownership] ******************************************************************************************************************* changed: [server1] TASK [Set permissions for directories] ************************************************************************************************* changed: [server1] TASK [Set permissions for files] ******************************************************************************************************* changed: [server1] TASK [Set up wp-config] **************************************************************************************************************** changed: [server1] RUNNING HANDLER [Reload Apache] ******************************************************************************************************** changed: [server1] RUNNING HANDLER [Restart Apache] ******************************************************************************************************* changed: [server1] PLAY RECAP ***************************************************************************************************************************** server1 : ok=22 changed=18 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

Remarque : pour plus d'informations sur la façon d'exécuter les playbooks Ansible, consultez notre Guide Ansible Cheat Sheet.

Lorsque le playbook a terminé de s'exécuter, vous pouvez vous rendre sur votre navigateur web pour terminer l'installation de WordPress à partir de là.

Naviguez vers le nom de domaine de votre serveur ou l'adresse IP publique :

http://server_host_or_IP

Vous verrez une page comme ceci :

WordPress language selection page

Après avoir sélectionné la langue que vous souhaitez utiliser pour votre installation de WordPress, une dernière étape vous sera présentée pour configurer votre utilisateur et votre mot de passe WordPress afin que vous puissiez vous connecter à votre panneau de contrôle :

Configuration WordPress

Lorsque vous cliquez, vous accédez à une page qui vous invite à vous connecter :

WP login prompt

Une fois connecté, vous serez redirigé vers le tableau de bord d'administration de WordPress :

Panneau d'administration WP

Quelques étapes courantes pour personnaliser votre installation WordPress comprennent le choix du paramètre des permaliens dans vos messages (se trouve dans Paramètres > Permaliens) et la sélection d'un nouveau thème (dans Apparence > Thèmes).

Le contenu du Playbook

Vous pouvez trouver la configuration du serveur WordPress sur LAMP présentée dans ce tutoriel dans le dossier wordpress-lamp_ubuntu1804 à l'intérieur du répertoire DigitalOcean Community Playbooks. Pour copier ou télécharger directement le contenu du script, cliquez sur le bouton Raw dans la partie supérieure de chaque script.

Le contenu complet du playbook ainsi que ses fichiers associés sont également inclus ici pour votre commodité.

vars/default.yml

Le fichier variable default.yml contient des valeurs qui seront utilisées dans les tâches du playbook, tels que les paramètres de la base de données et le nom du domaine à configurer au sein d'Apache.

vars/default.yml
#System Settings
php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]

#MySQL Settings
mysql_root_password: "mysql_root_password"
mysql_db: "wordpress"
mysql_user: "sammy"
mysql_password: "password"

#HTTP Settings
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"

files/apache.conf.j2

Le fichier apache.conf.j2 est un fichier template Jinja 2 qui configure un nouveau VirtualHost Apache. Les variables utilisées dans ce modèle sont définies dans le fichier variable vars/default.yml.

files/apache.conf.j2
<VirtualHost *:{{ http_port }}>
   ServerAdmin webmaster@localhost
   ServerName {{ http_host }}
   ServerAlias www.{{ http_host }}
   DocumentRoot /var/www/{{ http_host }}
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined

   <Directory /var/www/{{ http_host }}>
         Options -Indexes
   </Directory>

   <IfModule mod_dir.c>
       DirectoryIndex index.php index.html index.cgi index.pl  index.xhtml index.htm
   </IfModule>

</VirtualHost>

files/wp-config.php.j2

Le fichier wp-config.php.j2 est un autre modèle Jinja, utilisé pour paramétrer le fichier de configuration principal utilisé par WordPress. Les variables utilisées dans ce modèle sont définies dans le fichier variable vars/default.yml. Des clés et des salts d'authentification uniques sont générés en utilisant une fonction de hachage.

files/info.php.j2
<?php
/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the
 * installation. You don't have to use the web site, you can
 * copy this file to "wp-config.php" and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * MySQL settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://codex.wordpress.org/Editing_wp-config.php
 *
 * @package WordPress
 */

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', '{{ mysql_db }}' );

/** MySQL database username */
define( 'DB_USER', '{{ mysql_user }}' );

/** MySQL database password */
define( 'DB_PASSWORD', '{{ mysql_password }}' );

/** MySQL hostname */
define( 'DB_HOST', 'localhost' );

/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );

/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

/** Filesystem access **/
define('FS_METHOD', 'direct');

/**#@+
 * Authentication Unique Keys and Salts.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define( 'AUTH_KEY',         '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'SECURE_AUTH_KEY',  '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'LOGGED_IN_KEY',    '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'NONCE_KEY',        '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'AUTH_SALT',        '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'SECURE_AUTH_SALT', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'LOGGED_IN_SALT',   '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'NONCE_SALT',       '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );

/**#@-*/

/**
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each
 * a unique prefix. Only numbers, letters, and underscores please!
 */
$table_prefix = 'wp_';

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 *
 * For information on other constants that can be used for debugging,
 * visit the Codex.
 *
 * @link https://codex.wordpress.org/Debugging_in_WordPress
 */
define( 'WP_DEBUG', false );

/* That's all, stop editing! Happy publishing. */

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
    define( 'ABSPATH', dirname( __FILE__ ) . '/' );
}

/** Sets up WordPress vars and included files. */
require_once( ABSPATH . 'wp-settings.php' );

playbook.yml

Le fichier playbook.yml est l'endroit où toutes les tâches de cette configuration sont définies. Il commence par définir le groupe de serveurs qui doit être la cible de cette configuration (tous), après quoi il utilise become: true pour définir que les tâches doivent être exécutées avec une élévation des privilèges sudo par défaut. Ensuite, il inclut le fichier variable vars/default.yml pour charger les options de configuration.

playbook.yml
---
- hosts: all
  become: true
  vars_files:
    - vars/default.yml

  tasks:
    - name: Install prerequisites
      apt: name=aptitude update_cache=yes state=latest force_apt_get=yes
      tags: [ system ]

    - name: Install LAMP Packages
      apt: name={{ item }} update_cache=yes state=latest
      loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ]
      tags: [ system ]

    - name: Install PHP Extensions
      apt: name={{ item }} update_cache=yes state=latest
      loop: "{{ php_modules }}"
      tags: [ system ]

  # Apache Configuration
    - name: Create document root
      file:
        path: "/var/www/{{ http_host }}"
        state: directory
        owner: "www-data"
        group: "www-data"
        mode: '0755'
      tags: [ apache ]

    - name: Set up Apache VirtualHost
      template:
        src: "files/apache.conf.j2"
        dest: "/etc/apache2/sites-available/{{ http_conf }}"
      notify: Reload Apache
      tags: [ apache ]

    - name: Enable rewrite module
      shell: /usr/sbin/a2enmod rewrite
      notify: Reload Apache
      tags: [ apache ]

    - name: Enable new site
      shell: /usr/sbin/a2ensite {{ http_conf }}
      notify: Reload Apache
      tags: [ apache ]

    - name: Disable default Apache site
      shell: /usr/sbin/a2dissite 000-default.conf
      notify: Restart Apache
      tags: [ apache ]

  # MySQL Configuration
    - name: Set the root password
      mysql_user:
        name: root
        password: "{{ mysql_root_password }}"
        login_unix_socket: /var/run/mysqld/mysqld.sock
      tags: [ mysql, mysql-root ]

    - name: Remove all anonymous user accounts
      mysql_user:
        name: ''
        host_all: yes
        state: absent
        login_user: root
        login_password: "{{ mysql_root_password }}"
      tags: [ mysql ]

    - name: Remove the MySQL test database
      mysql_db:
        name: test
        state: absent
        login_user: root
        login_password: "{{ mysql_root_password }}"
      tags: [ mysql ]

    - name: Creates database for WordPress
      mysql_db:
        name: "{{ mysql_db }}"
        state: present
        login_user: root
        login_password: "{{ mysql_root_password }}"
      tags: [ mysql ]

    - name: Create MySQL user for WordPress
      mysql_user:
        name: "{{ mysql_user }}"
        password: "{{ mysql_password }}"
        priv: "{{ mysql_db }}.*:ALL"
        state: present
        login_user: root
        login_password: "{{ mysql_root_password }}"
      tags: [ mysql ]

  # UFW Configuration
    - name: "UFW - Allow HTTP on port {{ http_port }}"
      ufw:
        rule: allow
        port: "{{ http_port }}"
        proto: tcp
      tags: [ system ]

  # WordPress Configuration
    - name: Download and unpack latest WordPress
      unarchive:
        src: https://wordpress.org/latest.tar.gz
        dest: "/var/www/{{ http_host }}"
        remote_src: yes
        creates: "/var/www/{{ http_host }}/wordpress"
      tags: [ wordpress ]

    - name: Set ownership
      file:
        path: "/var/www/{{ http_host }}"
        state: directory
        recurse: yes
        owner: www-data
        group: www-data
      tags: [ wordpress ]

    - name: Set permissions for directories
      shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type d -exec chmod 750 {} \\;"
      tags: [ wordpress ]

    - name: Set permissions for files
      shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type f -exec chmod 640 {} \\;"
      tags: [ wordpress ]

    - name: Set up wp-config
      template:
        src: "files/wp-config.php.j2"
        dest: "/var/www/{{ http_host }}/wordpress/wp-config.php"
      tags: [ wordpress ]

  handlers:
    - name: Reload Apache
      service:
        name: apache2
        state: reloaded

    - name: Restart Apache
      service:
        name: apache2
        state: restarted

N'hésitez pas à modifier ces fichiers pour qu’ils répondent au mieux à vos besoins individuels dans votre propre flux de travail.

Conclusion

Dans ce guide, nous avons utilisé Ansible pour automatiser le processus d'installation et de création d'un site web WordPress avec LAMP sur un serveur Ubuntu 18.04.

Si vous souhaitez inclure d'autres tâches dans ce playbook pour personnaliser davantage la configuration de votre serveur, veuillez vous référer à notre guide d'introduction à Ansible, Gestion de la configuration 101 : L'écriture de Playbooks Ansible.

Creative Commons License