J'ai un problème ici où j'essaie d'automatiser une configuration avec Ansible.
Certaines étapes nécessitent une interaction avec apt
, mais parfois, une erreur se produit car la mise à niveau sans surveillance a démarré et verrouillé apt. Cela fera arrêter le livre de jeu.
J'ai essayé de nombreuses manières de contourner ce problème, le plus réussi étant la répétition d'une commande apt en échec.
Mais cela n’a pas d’échelle, n’est pas fiable à 100% et est désagréable.
J'ai choisi d'émettre un apt -y purge unattended-upgrades
droit au début du livre de jeu. J'ai aussi essayé apt -y remove unattended-upgrades
, mais celui-ci semble revenir tant qu'il est encore au travail. La purge semble arrêter les mises à niveau sans surveillance, comme avant sa fermeture, ce que je veux.
Mais il s'avère que même cet appel à apt -y purge unattended-upgrades
peut échouer à cause du verrouillage. Donc je l'ai changé en while [[ $(dpkg -l | grep -P "unattended-upgrades" | wc -c) -ne 0 ]]; do apt -y purge unattended-upgrades; done
, mais cela échoue aussi occasionnellement (je ne comprends pas pourquoi)
J'ai besoin d'une commande qui, une fois exécutée, terminera et enterrera les mises à niveau sans surveillance immédiatement, qu'elle soit en cours d'exécution ou non, et garantira qu'elle ne démarrera plus dès que cette commande sera retournée, jusqu'à ce que je l'exécute apt install
à nouveau explicitement . Ce n'est pas grave si cette commande prend une minute pour terminer son travail.
En outre, Python n’est pas installé sur le système. Ansible n’émet que des raw
commandes, jusqu’à ce que j’installe Python, ce qui devrait se faire après un appel réussi àapt -y update
Je suis dans un état où je peux facilement déclencher des mises à niveau sans surveillance, car il s'agit d'une machine virtuelle, et dès que je date -s
lance une commande pour corriger la date obsolète, la mise à niveau sans surveillance démarre. Après le démarrage de la machine virtuelle, j'ai quelques minutes jusqu’à ce que se date
corrige automatiquement, ce qui lance alors les mises à niveau sans assistance.
C'est ce que je fais maintenant:
- name: Disable autoupdate (part 1 of 2)
raw: sed -i /Update/s/"1"/"0"/ /etc/apt/apt.conf.d/10periodic && sync
- name: Disable autoupdate (part 2 of 2)
raw: echo 'APT::Periodic::Unattended-Upgrade "0";' >> /etc/apt/apt.conf.d/10periodic && sync
- name: Terminate any active autoupdate
raw: ps -A | grep unattended-upgrades | awk '{print $1}' | xargs -r kill -15 $1
- name: Terminate any active dpkg
raw: ps -A | grep dpkg | awk '{print $1}' | xargs -r kill -15 $1
- name: Allow dpkg to recover
raw: dpkg --configure -a
- name: Purge autoupdate
raw: apt -y purge unattended-upgrades
- name: Update apt cache
raw: apt -y update
- name: If needed, install Python
raw: test -e /usr/bin/python || apt -y install python
Terminer dpkg est ce qui me fait peur. Tout ce qui est exécuté sur une nouvelle installation d'Ubuntu Server 18.04.1
Voici la solution créée en utilisant la réponse acceptée:
la source
dpkg --purge unattended-upgrades
au lieu deapt -y purge unattended-upgrades
(ce que je fais maintenant)?apt-get
dans les scripts, de sorte que leapt
programme interactif ait toute liberté pour changer de comportement afin de le rendre plus convivial.python
, ubuntu1804 seulementpython3
. linuxconfig.org/… / docs.ansible.com/ansible/latest/installation_guide/…Réponses:
Apparemment, il
unattended-upgrades
est exécuté depuis l’une des unités systemd apt-daily.service / apt-daily-upgrade.service. (Ceux-ci sont à leur tour déclenchés par des.timer
unités systemd , portant les mêmes noms).Vous pouvez essayer d’attendre les unités systemd comme suit:
Ceci est indépendant de savoir si vous voulez envoyer SIGTERM
dpkg
ouapt-get
ou quelque chose pour essayer de les amener à terminer plus rapidement.kill
ne transmet qu'un signal; il n'attend rien. En principe, vous devez toujours attendre avant de pouvoir utiliser la ressource libérée.la source
apt
). Il attend la fin des services apt déclenchés par le minuteur, s’ils sont en cours d’exécution. Apparemment, ce sont ces derniers qui exécutent les travaux planifiés sans mises à niveau. C'est peut-être une approche plus générale, puisque apt-daily peut exécuter une mise à jour quotidienne d'apt-get même si le paquet de mises à jour sans surveillance n'est pas installé. Je ne sais rien au sujet de tuer auparavant le processus de mises à niveau sans surveillance - je ne sais pas si cela fait quelque chose d'utile ou est moins brutal que de tuer dpkg./etc/apt/apt.conf.d/10periodic
modification, puis émettre votre commande et attendre qu’elle se termine doit laisser le système dans un état où seul je déclenchedpkg
(par quelque moyen que ce soit)? Je vais essayer.