Ansible : playbook avancé, avec handlers et templates

De Justine's wiki
Aller à la navigation Aller à la recherche

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.