Ansible

12 Exemple système

Pour cet exemple concret, nous allons mettre en place un serveur WordPress, en détaillant les différentes étapes :

  • La mise en place du « Playbook » WordPress.yml
  • La mise en place des « Roles » nécessaires pour l’installation du serveur
    • Server  (Définition de la configuration du serveur – Installation des packages de base)
    • PHP
    • MySQL
    • WordPress
  • Les fichiers de variables et les variables par défaut

Note : Il est indispensable de respecter l’indentation pour ne pas générer des erreurs.

Rappelons que le fichier WordPress représente notre « Playbook » et qu’il ne servira qu’à appeler des « Roles » et les déployer sur le ou les machines demandées.

WordPress.yml

- hosts: wordpress

roles:
 - server
 - php
 - mysql
 - wordpress

Il est fortement conseillé d’étudier la documentation, sur les bonnes pratiques pour implémenter les « Roles ». Dans notre cas, nous allons illustrer comment créer automatiquement le « Role server » avec la commande :

ansible-galaxy init server

Une fois créé, il est configuré en modifiant le fichier « tasks/main.yml »

roles/server/tasks/main.yml

---
- name: Update apt cache
  apt: update_cache=yes cache_valid_time=3600
  become: yes

- name: Install required software
  apt: name={{ item }} state=present
  become: yes
  with_items:
   - apache2
   - mysql-server
   - php-mysql
   - php
   - libapache2-mod-php
   - php-mcrypt
   - python-mysqldb

La première directive apt permet de demander au serveur de procéder à la mise à jour des paquets. La seconde permet d’installer les paquets sur le serveur en fonction de la liste renseignée dans {{ with_items }}.

Ce « Role » est le plus simple de tous mais il permet d’avoir installé les paquets nécessaires au bon déroulement des actions suivantes.

L’installation continue par le déploiement du « Role php » qui permettra d’installer et de configurer PHP comme souhaité.

Ce « Role » contiendra à la fois des « Tasks », comme précédemment, mais également un « Handler » permettant de relancer le service PHP une fois installé. La particularité est qu’il ne relance le service que si les actions précédentes se sont bien passés OU si des modifications ont été apportées à la configuration.

roles/php/tasks/main.yml

--- 

# Configure and secure php.ini

- name: php.ini - Change max upload size to 15M
  replace: dest=/etc/php/7.0/apache2/php.ini regexp='^upload_max_filesize = .*$' replace='upload_max_filesize = 15M'
 notify: restart apache

- name: php.ini - Change memory limit to 256M
  replace: dest=/etc/php/7.0/apache2/php.ini regexp='^memory_limit = .*$' replace='memory_limit = 256M'
 notify: restart apache

Le module « replace » permet de remplacer des lignes dans un fichier. Une regex est appliquée pour modifier le fichier « php.ini », plus particulièrement la limite de taille d’envoi et la limitation mémoire pour le serveur.

La directive « notify » est utilisée pour relancer le serveur Apache, en appelant le Handler « Restart Apache », contenant les lignes suivantes :

roles/php/handlers/main.yml

---

- name: restart apache
  service: name=apache2 state=restarted
  become: yes

Une fois l’installation et la configuration de PHP faite, le « Playbook » lance ensuite l’installation de MySQL pour créer la base de données ainsi que l’utilisateur.

roles/mysql/tasks/main.yml

---
- name: Create mysql database
 mysql_db: name={{ wp_mysql_db }} state=present

- name: Create mysql user
 mysql_user: 
 name={{ wp_mysql_user }} 
 password={{ wp_mysql_password }} 
 priv=*.*:ALL

Les valeurs des variables {{ wp_mysql_db }}, {{ wp_mysql_user }} et {{ wp_mysql_password }} sont définies ci dessous :

roles/mysql/defaults/main.yml

---
wp_mysql_db: wordpress
wp_mysql_user: wordpress
wp_mysql_password: wp_db_password

Ce fichier est un peu particulier car il contient l’ensemble des variables par défaut que vous avez définis. Vous pouvez surcharger ces variables, notamment pour des serveurs différents, sans pour autant modifier le « Playbook ».

Pour finir l’installation de WordPress, le « Playbook » va télécharger l’archive dans sa dernière version sur le site officiel de WordPress, puis il va le décompresser, l’installer et le configurer.

roles/wordpress/tasks/main.yml

---
- name: Download WordPress
  get_url:
  url=https://wordpress.org/latest.tar.gz
  dest=/tmp/wordpress.tar.gz
  validate_certs=no
  become: yes

- name: Extract WordPress
  unarchive:
  src=/tmp/wordpress.tar.gz dest=/var/www/
  copy=no
  become: yes

- name: Update default Apache site
  become: yes
  lineinfile:
  dest=/etc/apache2/sites-enabled/000-default.conf
  regexp="(.)+DocumentRoot /var/www/html"
  line="DocumentRoot /var/www/wordpress"
  notify:
  - restart apache

- name: Copy sample config file
  command: 
  mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php creates=/var/www/wordpress/wp-config.php
 
  become: yes

- name: Update WordPress config file
  lineinfile:
  dest=/var/www/wordpress/wp-config.php
  regexp="{{ item.regexp }}"
  line="{{ item.line }}"
  with_items:
   - {'regexp': "define\\('DB_NAME', '(.)+'\\);", 'line': "define('DB_NAME', '{{wp_mysql_db}}');"}
   - {'regexp': "define\\('DB_USER', '(.)+'\\);", 'line': "define('DB_USER', '{{wp_mysql_user}}');"}
   - {'regexp': "define\\('DB_PASSWORD', '(.)+'\\);", 'line': "define('DB_PASSWORD', '{{wp_mysql_password}}');"}
  become: yes

- name: chown directories to www-data
  command: chown -R www-data:www-data "/var/www/wordpress"

- name: Ensure directories are 0755
  command: find "/var/www/wordpress" -type d -exec chmod 0755 {} \;

- name: Ensure files are 0644
  command: find "/var/www/wordpress" -type f -exec chmod 0644 {} \;

Le « Role » WordPress appelle également un Handler « Restart Apache ».

roles/wordpress/handlers/main.yml

---

- name: restart apache
  service: name=apache2 state=restarted
  become: yes

L’installation est, maintenant, complète.