Ansible : playbook avancé, avec handlers et templates
Playbook avancé : installation de MediaWiki
Afin d'avoir quelque chose de plus intéressant, nous avons un projet permettant de déployer un wiki MediaWiki sur une machine Debian 9. Le projet contient :
- mediawiki.yml
- inventaire.ini
- my.cnf.j2
Une fois le playbook utilisé, le wiki est quasi prêt : il reste encore à finir le petit menu d'installation dans le navigateur, et à déposer le fichier LocalSettings.cf. Cette opération aurait pû être automatisée, mais cela voudrait dire importer le contenu de la base de données (ce qui est faisable). J'ai préféré faire court ici.
Le playbook
<syntaxhighlight lang='yaml'> --- - hosts: all
become: true
handlers:
#Handlers only act when they are notified
- name: Restart Apache
systemd:
name: apache2
state: restarted
enabled: True
- name: Start mariadb
systemd:
name: mysqld
state: started
enabled: true
tasks:
- name: Install LAMP
apt:
name: "Modèle:Packages"
state: installed
update_cache: yes
force_apt_get: yes
vars:
packages:
- apache2
- php
- php-apcu
- php-intl
- php-mbstring
- php-mysql
- php-xml
- mariadb-server
- python-pymysql
notify:
- Start mariadb
- name: Download site
get_url:
url: https://releases.wikimedia.org/mediawiki/1.33/mediawiki-1.33.0.tar.gz
dest: /root/mediawiki.tar.gz
mode: 0o760
- name: Unzip mediawiki to /var/www/
unarchive:
src: /root/mediawiki.tar.gz
dest: /var/www/html/
remote_src: yes
mode: 0o770
- name: change perms on site
file:
path: /var/www/html/mediawiki-1.33.0
state: directory
recurse: yes
owner: www-data
group: www-data
#We need this file to be able to connect to the database, ansible
#does not know the Mariadb way
- name: create my.cnf
template:
src: "Modèle:Playbook dir/my.cnf.j2"
dest: /root/.my.cnf
owner: root
group: root
mode: 0o600
- name: MariaDB database
mysql_db:
name: mediawiki_data
state: present
login_unix_socket: /var/run/mysqld/mysqld.sock
#Ansible does not find it by itself
- name: MariaDB user
mysql_user:
name: "mediawikiuser"
password: "Modèle:Passwordmediawikimysql"
priv: 'mediawiki_data.*:ALL'
state: present
login_unix_socket: /var/run/mysqld/mysqld.sock
notify:
- Restart Apache
</syntaxhighlight>
Voir les commentaires.
Handlers
Les handlers sont comme des tâches qui s'exécuteront quand elles seront appellées. Il y'a plusieurs façons de les appeller, mais basiquement elles sont appellées quand les tâches avec la mention nnotify s'accomplissent. Les handlers sont TOUJOURS en haut du playbook.
Ici, cette tâche :
<syntaxhighlight lang='yaml'>
- name: MariaDB user
mysql_user:
name: "mediawikiuser"
password: "Modèle:Passwordmysql"
priv: 'mediawiki_data.*:ALL'
state: present
login_unix_socket: /var/run/mysqld/mysqld.sock
notify:
- Restart Apache
</syntaxhighlight>
... une fois accomplie (et bel et bien accomplie : "changed", pas "ok") appellera le handler suivant :
<syntaxhighlight lang='yaml'>
- name: Restart Apache
systemd:
name: apache2
state: restarted
enabled: True
</syntaxhighlight>
templates
L'utilisation de templates consiste à partir d'un fichier local, formaté pour jinja2, et à le copier sur la cible en remplissant les variables jinja2 par les bonnes valeurs. C'est assez simple à comprendre, et cela permet d'avoir une collection de fichiers vierges qui seront copiés et remplis automatiquement sur les machines. Ils sont en général nommé fichier.extension.j2; par exemple : index.html.j2.
Voici le template utilisé ici:
<syntaxhighlight lang='python'> [client] user=root password=Modèle:Passwordmysql </syntaxhighlight>
Ici, ce template est appellé par le module associé. Une fois copié, sur la machine il donnera quelque chose comme:
<syntaxhighlight lang='python'> [client] user=root password=monsupermotdepasse </syntaxhighlight>
L'inventaire
L'inventaire n'as rien de spécial, et a une deux variables en plus de la non-vérification des clefs :
[target] 192.168.1.46 [target:vars] ansible_ssh_common_args='-o StrictHostKeyChecking=no' passwordmysql=monsupermotdepasse passwordmediawikimysql=encoreunmotdepasse
Le premier mot de passe est celui de root qui doit accéder à MariaDB, le second celui pour Mediawiki, qu'il faudra retenir pour finaliser l'installation.