Initiation Ansible - Exercice 3
===
# Objectifs
1. Créer un rôle pour déployer Wordpress sur notre plateforme LAMP.
1. Utiliser Ansible Vault pour stocker des informations sensibles.
# Les `group_vars`
Pour mettre en place **Ansible Vault**, il est possible d'utiliser la notion de `group_vars` pour définir des variables spécifiques à un groupe d'hôtes. Ces variables vont venir surcharger celles définies au niveau du rôle.
Le calcul des priorités sur les valeurs des variables est défini sur le page suivante : https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#ansible-variable-precedence
```
~/ansible
└── group_vars
└── [group_name]
└── main.yml # fichier YAML en clair pour le déploiement
└── vault.yml # fichier YAML chiffré avec Ansible Vault
```
# infos pratiques
## Structure d'une archive Wordpress
_(limité à 1 niveau)_
```
wordpress
├── index.php
├── license.txt
├── readme.html
├── wp-activate.php
├── wp-admin/
├── wp-blog-header.php
├── wp-comments-post.php
├── wp-config-sample.php
├── wp-content/
├── wp-cron.php
├── wp-includes/
├── wp-links-opml.php
├── wp-load.php
├── wp-login.php
├── wp-mail.php
├── wp-settings.php
├── wp-signup.php
├── wp-trackback.php
└── xmlrpc.php
```
## Sections à modifier du fichier `wp-config.php`
```php
<?php
...
// ** Réglages MySQL - Votre hébergeur doit vous fournir ces informations. ** //
/** Nom de la base de données de WordPress. */
define('DB_NAME', 'votre_nom_de_bdd');
/** Utilisateur de la base de données MySQL. */
define('DB_USER', 'votre_utilisateur_de_bdd');
/** Mot de passe de la base de données MySQL. */
define('DB_PASSWORD', 'votre_mdp_de_bdd');
/** Adresse de l’hébergement MySQL. */
define('DB_HOST', 'localhost');
```
et
```php
<?php
...
$table_prefix = 'wp_';
```
## Utilisation du module `stat` et de `register` pour un traitement conditionnel
```yaml
- name: tester si le site est deja deploye
stat:
path: ...
register: config
- name: Telecharge et decompresse l'archive de Wordpress
unarchive:
remote_src: yes
src: ...
dest: ...
extra_opts:
- '--strip-components=1'
when: not config.stat.exists
```
# Liste des tâches à réaliser
Pour rendre le rôle facilement réutilisable, nous allons définir des variables au format **jinja2**, pour l'utilisation du rôle, qui seront valuées au niveau `group_vars` lors de l'exécution du playbook.
:::info
Pour plus d'information sur l'utilisation du moteur de template JinJa2: https://jinja.palletsprojects.com/en/2.10.x/
:::
| vars role (jinja) | valeurs par défaut |
| ----------------- | ------------------ |
| wp_dbname | wordpress_db |
| wp_dbuser | wordpress_user |
| wp_dbpass | wordpress_password |
| wp_dbprefix | wp_ |
| wp_dbhost | db-XX |
| wp_www_path | /var/www/html |
:::warning
pensez à remplacer le XX de la valeur par défaut de `wp_dbhost` par votre numéro.
:::
## Créer un rôle `formation.wp` qui réalisera :
- tester l'existence du fichier `wp-config.php` qui indiquerait qu'un déploiement à déjà été réalisé (module `stat` et attribut `register` de la tâche; voir `ansible-doc stat`)
- les tâches suivantes ne devront être réalisées qu'en cas de non-existence préalable du fichier `wp-config.php` (utilisation de l'attribut `when` et de la variable `register` de l'étape précédente):
- le téléchargement de l'archive wordpress sur le site officiel (https://fr.wordpress.org/latest-fr_FR.tar.gz) et la décompression de cette archive dans le dossier `/var/www/html` de la machine `web-XX` (module `unarchive` avec `remote_src: yes`)
- la recopie du fichier de configuration d'exemple (`wp-config-sample.php` en `wp-config.php` avec le module `copy`)
- la configuration, avec le module `lineinfile`, des éléments de connexion MySQL dans le fichier `wp-config.php` de l'installation Wordpress
- chercher le pattern regexp `^define.'DB_NAME', .*$` et substituer la ligne correspondante avec `define('DB_NAME', '{{ wp_dbname }}');`
- chercher le pattern regexp `^define.'DB_USER', .*$` et substituer la ligne correspondante avec `define('DB_USER', '{{ wp_dbuser }}');`
- chercher le pattern regexp `^define.'DB_PASSWORD', .*$` et substituer la ligne correspondante avec `define('DB_PASSWORD', '{{ wp_dbpass }}');`
- chercher le pattern regexp `^define.'DB_HOST', .*$` et substituer la ligne correspondante avec `define('DB_HOST', '{{ wp_dbhost }}');`
- chercher le pattern regexp `table_prefix =.*$` et substituer la ligne correspondante avec `$table_prefix = '{{ wp_dbprefix }}';`
- définir les variables correspondantes dans `~/ansible/group_vars/all/vault.yml` tel que défini dans le tableau précédent
- chiffrer le fichier `~/ansible/group_vars/all/vault.yml` avec **ansible-vault** :
```
ansible-vault encrypt --ask-vault-pass ~/ansible/group_vars/all/vault.yml
```
- visualiser le contenu du fichier `~/ansible/group_vars/all/vault.yml`, vous verrez qu'il n'est plus possible d'accéder aux valeurs, sauf à lancer un déchiffrement
- exécuter le playbook pour installer Wordpress avec l’option --ask-vault-pass afin de déchiffrer le fichier vault.yml pour la durée de l’exécution
- Se rendre sur le site WordPress à l'URL http://web-XX
- Configurer le compte administrateur et l'URL et titre du site
:::warning
Le module `unarchive` nécessite que la commande `unzip` soit disponible sur le machine cible pour décompresse une archive .zip, il vous faudra prévoir son installation **avant** la première tâche utilisant le module `unarchive`.
:::
:::info
Les pointeurs web de documentation nécessaires :
- https://docs.ansible.com/ansible/latest/modules/lineinfile_module.html
- https://docs.ansible.com/ansible/latest/modules/unarchive_module.html
:::