Mettre à jour les images VyOS avec Ansible

Sur VyOS, le tag d'une image de conteneur ne vit pas dans un fichier de configuration : il vit dans config.boot. Le mettre à jour demande donc une transaction de configuration, pas un docker pull. Voici comment le faire avec Ansible.

Le dépôt

Les playbooks sont dans vyos-deploy. Il ne fournit aucun inventaire : il s'utilise depuis le vôtre, en clone direct ou en submodule Git.

git submodule add https://github.com/jbsky/vyos-deploy external/vyos-deploy
ansible-playbook external/vyos-deploy/image-update.yaml -i inventories/production

Le playbook qui nous intéresse est image-update.yaml. C'est le seul du dépôt qui modifie la configuration du routeur — les autres déploient des fichiers de configuration et se contentent de vérifier que les images correspondent à ce qui est déclaré.

Déclarer les images

Tout part d'une variable d'inventaire. Le playbook ne connaît aucun nom de conteneur : ce que vous déclarez ici est ce qu'il gère.

# host_vars/vyos.home.arpa/main.yaml
vyos_container_images:
  bind9: docker.io/jbsky/bind9-hardened:TAG
  squid: docker.io/jbsky/squid-hardened:TAG
  c-icap: docker.io/jbsky/c-icap-hardened:TAG
  clamav: docker.io/jbsky/clamav-hardened:TAG
  suricata: docker.io/jbsky/suricata-hardened:TAG

La référence doit être complète, registre compris : VyOS a son propre registre de recherche par défaut, et un nom court irait interroger le mauvais.

Deux façons de choisir les tags.

Figés

Vous écrivez les versions à la main. C'est le mode le plus prévisible : l'inventaire est la référence, il est versionné, et une montée de version est un commit qui se relit.

Calculés

Le playbook peut les résoudre pour vous, en interrogeant le registre :

ansible-playbook image-update.yaml -i inventories/production --tags latest

Il affiche, pour chaque service, le dernier tag disponible face à celui que l'inventaire déclare. Avec une option, il écrit directement l'inventaire :

ansible-playbook image-update.yaml -i inventories/production \
  --tags latest -e write_inventory=true

git diff -- inventories/production/host_vars/vyos.home.arpa/main.yaml

Rien n'est envoyé au routeur à cette étape : seul le fichier d'inventaire change, et vous relisez le diff avant de committer.

Le tag retenu est toujours un tag immuable. Ces images publient latest et la version amont seule, qui sont réécrites à chaque reconstruction — le playbook les ignore et ne retient que celui qui porte un compteur de révision, le seul qui désigne toujours la même image.

Le workflow

Trois phases, dans cet ordre.

check — voir ce qui va changer

ansible-playbook image-update.yaml -i inventories/production --tags check
bind9    : deja au tag declare
squid    : TAG_COURANT -> TAG_DECLARE
suricata : TAG_COURANT -> TAG_DECLARE
4 image(s) a mettre a jour sur 5 retenue(s).

Cette phase ne touche à rien. Elle compare ce que le routeur fait tourner à ce que l'inventaire déclare.

pull — télécharger

ansible-playbook image-update.yaml -i inventories/production --tags pull

Elle télécharge les images qui changent, et rien d'autre. La séparer permet de pré-charger en journée et de n'appliquer que dans une fenêtre de maintenance.

C'est aussi la seule étape qui peut échouer pour une raison extérieure — registre injoignable, tag inexistant. La passer d'abord évite de découvrir le problème une fois la configuration entamée.

apply — poser les tags

ansible-playbook image-update.yaml -i inventories/production --tags apply

Elle pose les tags dans config.boot, commit, sauvegarde, relit la configuration pour vérifier que le routeur montre bien les images attendues, puis redémarre les conteneurs concernés.

Le redémarrage passe par la commande native de VyOS, jamais par podman : les conteneurs y sont gérés par systemd, et un podman stop les supprimerait.

Ne mettre à jour qu'un service

Les noms de service sont utilisables comme tags, et se combinent avec les phases :

ansible-playbook image-update.yaml -i inventories/production --tags check,squid
ansible-playbook image-update.yaml -i inventories/production --tags pull,apply,squid
ansible-playbook image-update.yaml -i inventories/production --skip-tags clamav

En résumé

# choisir les versions (si vous les calculez)
--tags latest -e write_inventory=true
git diff && git commit

# puis dérouler
--tags check
--tags pull
--tags apply

Ces playbooks touchent le DNS et le proxy : ils se lancent par une chaîne CI avec une porte manuelle, pas depuis un poste.


Liens

Articles connexes


Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.