Terminez et désactivez / supprimez la mise à niveau sans surveillance avant le retour de la commande

5

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-upgradesdroit 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-upgradespeut é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 rawcommandes, 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 -slance 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 datecorrige 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:

https://stackoverflow.com/a/51919678/277267

Daniel F
la source
1
Je n'autorise jamais les mises à niveau sans surveillance à proximité d'un serveur de production. Cependant, je conseille de faire toutes les mises à jour avant d'exécuter d'autres opérations ansible.
Rui F Ribeiro
1
Y a-t-il un avantage à utiliser dpkg --purge unattended-upgradesau lieu de apt -y purge unattended-upgrades(ce que je fais maintenant)?
Daniel F
4
Au fait, vous êtes censé l’utiliser apt-getdans les scripts, de sorte que le aptprogramme interactif ait toute liberté pour changer de comportement afin de le rendre plus convivial.
sourcejedi
1
@RuiFRibeiro Erreur due à Ansible python, ubuntu1804 seulement python3. linuxconfig.org/… / docs.ansible.com/ansible/latest/installation_guide/…
sourcejedi
1
@RuiFRibeiro ne sait pas à quel point Ansible fait une différence dans cette situation. github.com/ansible/ansible/issues/25414
sourcejedi

Réponses:

7

Apparemment, il unattended-upgradesest 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 .timerunités systemd , portant les mêmes noms).

Vous pouvez essayer d’attendre les unités systemd comme suit:

systemd-run --property="After=apt-daily.service apt-daily-upgrade.service" --wait /bin/true

Ceci est indépendant de savoir si vous voulez envoyer SIGTERM dpkgou apt-getou quelque chose pour essayer de les amener à terminer plus rapidement. killne transmet qu'un signal; il n'attend rien. En principe, vous devez toujours attendre avant de pouvoir utiliser la ressource libérée.

sourcejedi
la source
Que fait cette commande? Attendez que dpkg se termine s’il a été démarré à la suite d’une mise à niveau sans surveillance? Je préférerais faire cela au lieu d’envoyer un SIGTERM, ce que je fais maintenant.
Daniel F
Il suppose que systemd (et suffisamment nouveau 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.
sourcejedi
1
Donc, tout d’abord, désactiver la mise à jour automatique via la /etc/apt/apt.conf.d/10periodicmodification, puis émettre votre commande et attendre qu’elle se termine doit laisser le système dans un état où seul je déclenche dpkg(par quelque moyen que ce soit)? Je vais essayer.
Daniel F
1
Je veux juste relier ici ma solution complète qui est basée sur votre réponse stackoverflow.com/a/51919678/277267
Daniel F