Mar 10 2021
Pourquoi Ansible Met à Jour les Paquets en Hold et Comment y Remédier
J’écrivais un nouveau rôle Ansible pour mettre à jour toutes mes VMs pour réaliser un apt update suivi d’un apt upgrade. J’utilise toujours une vieille version de Rancher qui ne fonctionne qu’avec la version 18.06 du paquet docker-ce sur lequel j’aimerais appliquer un apt hold.
Une première tâche met le paquet en hold c’est-à-dire en interdit la mise à jour avec le module Ansible Dpkg, comme recommandé sur de nombreux sites web.
Une deuxième et troisième étapes exécutent un apt update et apt full upgrade de mon système avec le module Ansible apt.
- name: keep docker from being updated on Rancher nodes
dpkg_selections:
name: docker-ce
selection: hold
- name: apt update cache
apt:
update_cache: yes
changed_when: False
- name: apt full-upgrade
apt:
upgrade: full
J’ai ensuite lancé mon playbook plein de confiance et, constaté que docker-ce avait été mis à jour! Bizarrement, les distributions Ubuntu semblent impactées, alors que ca fonctionne bien sur la famille Debian.
La page du module Ansible apt mentionne « Option full, lance une full-upgrade aptitude ».
Vérifions le paquet en hold après la 1re étape:
$ dpkg -l | grep docker
hi docker-ce 18.06.3~ce~3-0~ubuntu. amd64. Docker: the open-source application container engine
La même chose avec aptitude:
$ aptitude search ~i | grep docker
i docker-ce - Docker: the open-source application container engine
h pour hold est MANQUANT!
apt-get et aptitude semblent reposer sur des fonctions hold différentes, d’où « dpkg –selections » qui ne permet pas de s’assurer qu’aptitude (la commande qui se charge des upgrades) ne touchera pas aux paquets « holdés ».
Et maintenant?
Nous avons de la chance, le module Ansible apt propose un moyen de forcer la mise à jour avec apt-get au lieu d’aptitude
- name: apt full-upgrade
apt:
upgrade: full
force_apt_get: yes
Problème résolu !