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
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
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.
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.
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.)
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.
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 :
{{ 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.
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
On va donc d'abord créer une machine virtuelle dans le cluster Patata pour pouvoir faire nos tests.
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 postgresqlpatroniprimary_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:
postgresql-13-postgis
sur tous les serveurs du cluster (variable postgresql_patroni_hosts
+ boucle), car delegated_to
ne peut recevoir qu'un seul 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
Pour la prochaine fois !
Prochain atelier Ansible: 18/05
Lieu : Chez Célo (Crainhem)
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.