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
- Playbooks : Depot vyos-deploy
- Images : Docker Hub
Laisser un commentaire