# 2023/05/14 (atelier) : Ansible * [Réunion précédente](https://doc.neutrinet.be/atelier-ansible-2023-03-20) * [Pad de la réunion](https://doc.neutrinet.be/atelier-ansible-2023-05-14#) Présences : - HgO - Célo ## Météo //Moment informel durant lequel on exprime **en peu de mots** comment on se sent et si on a une attente forte pour la réunion.// //**Ce n'est pas un moment de discussion mais d'expression individuelle et ce n'est pas obligatoire :-)**// ### Attente(s) forte(s) //Si l'une ou l'autre personne exprime une attente forte, merci de vous en occuper en priorité ou de la noter dans le hub ou dans un point approprié//. Fin: 18h max ## Pre-commit On a eu un petit soucis avec pre-commit. En gros, à chaque fois qu'on va faire un `git push`, il va essayer de réparer les espaces et les retour à la ligne. Lorsqu'il a modifié des fichiers, il va attendre que l'utilisateur vérifie que tout est correct. Il faut donc faire un `git add` des fichiers modifiés, puis `git commit` et enfin `git push`. On peut tester tout ça en lançant `pre-commit run --all-files`. On a aussi remarqué qu'il y avait un problème avec la dernière version de `ansible-compat` (4.0.0). On doit donc régler le problème en modifiant le fichier `.pre-commit-config.yaml`, où on rajoute dans les dépendances: ``` ansible-compat~=3.0 ``` Le `~=` signifie qu'on veut une version `>= 3.0`, mais aussi tout ce qui est en `3.*` (donc 3.1 serait valide, mais pas 4.0). Voir aussi la doc https://peps.python.org/pep-0440/#compatible-release On avait eu le même souci avec molecule qui utilise aussi ansible-compat, donc il faut faire un MR avec les deux modifs. ## Anciens TODOs - Comprendre pourquoi git-secret n'aime pas Célo -> ça fonctionne maintenant - Déclencher la migration de la db uniquement lorsque la version de Mobilizon a changé - Installer la dépendence postgresql pour l'extension postgis. Voir le rôle postgres_db pour les delegate_to - Voir si avoir un lien symbolique serait pertinent - Tester le redémarrage de la VM ## Review du playbook Mobilizon Pour la migration de la db, Célo a créé un handler qui se déclenche au moment du téléchargement de l'archive. Il faut bien faire attention à l'ordre d'exécution des handlers : on veut faire la migration avant le restart, sinon il ne prendra pas en compte les changements dans la db. L'ordre d'exécution est défini dans le fichier des handlers. Note: Pour voir les modifications faites par le playbook molecule, on peut faire: ``` molecule converge -- --diff ``` On dit à Ansilbe de redémarrer Mobilizon lorsque la tâche qui copie la config de Mobilizon a changé. Cela se fait au moyen d'un `notify: restart mobilizon`. Pour l'installation des extensions PostgreSQL, il faudra voir comment cela se passe sur un cluster. En effet, on ne sait pas s'il faut installer l'extension sur chaque serveur ou pas. Célo a aussi rajouté un lien symbolique sur `/var/www/mobilizon-be/dist`. Cela permet d'avoir une config systemd un peu plus propre, et on sait directement quelle est la dernière version installée. ### Monitoring Voir si on peut récupérer des metrics de Mobilizon (bonus) A priori, Mobilizon ne fournit pas de metrics (on supprime le dossier et la config que Célo a tentée.) ### Backups C'est fait. On peut tester un backup avec : ``` /opt/borgmatic/bin/borgmatic create /opt/borgmatic/bin/borgmatic list /opt/borgmatic/bin/borgmatic mount --repository ssh://bullseye-mobilizon-molecule/media/data/backups/bullseye-mobilizon-molecule --archive latest --mount-point /mnt/ --config /etc/borgmatic.d/mobilizon-mobilizon-be.yml ``` On doit spécifier la config borgmatic, sinon il râle car il y a plusieurs configs possibles (mobilizon, système, haproxy, etc.) Le dump de la db se trouve dans `/root/.borgmatic` Quand on a fini, on fait juste `umount /mnt` Si on veut spécifier une archive en particulier, il faut faire `/opt/borgmatic/bin/borgmatic list` puis prendre la valeur dans la première colonne. Par ex : `mobilizon-mobilizon-be_bullseye-mobilizon-molecule-2023-05-14T14:53:29` Il y a un timer qui tourne toutes les 3h pour faire un backup: `systemctl status borgmatic.timer`. On voit quand il a été exécuté, et quand il sera exécuté prochainement. On peut aussi le forcer en faisant: `systemctl start borgmatic`. Attention: Il faut bien penser à faire un `umount` des backups, sinon Borg refusera d'effectuer de nouveau backups. ### HAProxy #### Configurer Caddy Dans la config `nginx` de mobilizon.be, on remarque qu'on a besoin d'un web serveur pour les fichiers javascripts et css. HAProxy n'est pas capable de faire, car il ne fait que reverse proxy. On va donc mettre un Caddy pour Mobilizon ! On traduit la config nginx de Mobilizon en langage Caddy : ```txt {{ ansible_managed | comment }} http://{{ mobilizon_domain }} { encode gzip zstd request_body { max_size 16MB } @staticfiles { path /js/* path /css/* } handle @staticfiles { root * /var/www/{{ mobilizon_owner }}/dist/priv/static header Cache-Control "public, max-age=31536000, immutable" header -ETag file_server } @mediafiles { path /media/* path /proxy/* } handle @mediafiles { header Cache-Control "public, max-age=31536000, immutable" header -ETag reverse_proxy localhost:4000 } handle_errors { @5xx expression `{err.status_code} >= 500 && {err.status_code} < 600` handle @5xx { root * /var/www/{{ mobilizon_owner }}/dist/priv/errors rewrite * /error.html file_server } } reverse_proxy localhost:4000 { {% if mobilizon_trusted_proxies | length > 0 %} trusted_proxies {{ mobilizon_trusted_proxies | join(' ') }} {% endif %} } log { output file "{{ caddy_log_dir }}/{{ mobilizon_owner }}.log" } } ``` Ca ne marche pas en l'état, mais on va tester avec HAProxy. #### Configurer HAProxy pour pouvoir tester en local Le problème c'est que HAProxy écoute sur le port 80, mais Caddy aussi ! On est dans le premier cas où on a besoin de Caddy et d'HAProxy :scream_cat: On va donc d'abord créer une machine virtuelle dans le cluster Patata pour pouvoir faire nos tests. #### Création d'une VM On a créé la VM `mobilizon.patata.louise.neutri.net` en suivant : https://wiki.neutrinet.be/fr/infra/notes_sur_infra_de_neutrinet On a rajouté la machine dans l'IPAM de Neutrinet: https://wiki.neutrinet.be/fr/infra/network/ipam#neutrinet_patata Et on la rajoute dans le DNS Resolver du Pfsense. On doit aussi rajouter la VM dans l'inventaire d'Ansible. Dans ```inventories/production```.ini. On la rajoute 2x, une fois dans le groupe patata et une fois dans le groupe mobilizon. Ensuite, on exécute le playbook commun pour provisionner la machine avec les utilisateurs et clés SSH: ``` ansible-playbook playbooks/apps/debian_commun.yml -l mobilizon.patata.louise.neutri.net -u root -k ``` Le playbook échoue au moment de la suppression du mot de passe pour root, ce qui est normal. On relance le playbook une deuxième fois sans la partie pour root: ``` ansible-playbook playbooks/apps/debian_commun.yml -l mobilizon.patata.louise.neutri.net ``` On copie les variables du rôles depuis `defaults/main.yml` vers `inventories/group_vars/mobilizon/vars.yml`. Dans ce fichier, on va juste changer les variables qui utilisent des secrets. On crée un vault avec les différents secrets (mot de passe et secrets pour Mobilizon): ``` ansible-vault create inventories/group_vars/mobilizon/vault.yml ``` On rajoute les trusted proxies pour Mobilizon, c'est-à-dire les adresses IP des haproxy. Puis on essaie de lancer le playbook mobilizon : ``` ansible-playbook playbooks/apps/mobilizon.yml --check --diff -l mobilizon ``` Comme on a une erreur avec l'installation des dépendance sur postgresql, on va utiliser ce petit bout de code pour voir si la variable postgresql_patroni_primary_host prend une valeur. On la place juste avant la tâche "Ajout des extensions nécessaires à postgresql". ``` - debug: var: postgresql_patroni_primary_host ``` C'était ok pour Ajout des extensions mais pas pour "Installation de la dépendance postgresql pour postgis" qui était plus haut dans le rôle. En fait, c'est parce qu'à ce moment, la variable n'est définie que dans le rôle `postgres_db`, donc on doit d'abord l'importer avant de pouvoir exécuter la tâche `Installation de la dépendance postgresql pour postgis`. On a ensuite une erreur parce que mobilizon n'arrive pas à se connecter à la BDD. Pourtant, elle a été crée. En fait, c'est parce que dans la config, Célo a bêtement mis localhost. ``` hostname: "localhost", ``` Il faut mettre: ``` hostname: "{{ postgresql_host }}", ``` On coupe le service Mobilizon, car la migration de la DB ne s'est pas faite, et du coup il ne parvient à s'y connecter. À voir pour plus tard... TODO: - Supprimer la VM et la recréer, pour voir si tous les handlers (notamment la migration de la DB) se déclenchent correctement - Installer le paquet `postgresql-13-postgis` sur tous les serveurs du cluster (variable `postgresql_patroni_hosts` + boucle), car `delegated_to` ne peut recevoir qu'un seul - Pour le moment, on a `postgresql-13-postgis` et la version majeure de PostgreSQL est hardcodée, il faudrait définir une variable pour ça, ou réutiliser la variable `postgresql_major_version` - Configurer le HAProxy de Neutrinet ## Gopass - Explication du password manager - Installation et configuration - Explication du concept de « password store » - Comment récupérer un mot de passe - Comment rajouter un nouveau mot de passe - Comment modifier un mot de passe - Comment supprimer un mot de passe - Ajouter et supprimer des personnes ## Préparation de la migration de Mobilizon Pour la prochaine fois ! ## Prochaine réunion Prochain atelier Ansible: 18/05 Lieu : Chez Célo (Crainhem) ## Météo de fin //Moment informel durant lequel on exprime **en peu de mots** comment, à titre personnel, la réunion a été vécue que ce soit positif ou négatif.// //Si une ou plusieurs **tension est née** durant la réunion, il est peut-être nécessaire d'envisager l'une ou l'autre réunion pour y remédier.// {{tag>infra atelier}}