12
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.