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.