Finalizar e desabilitar / remover atualização autônoma antes do retorno do comando

4

Estou tendo um problema aqui em que tento automatizar uma configuração com o Ansible.

Algumas das etapas exigem interação com apt , mas ocasionalmente recebo um erro porque a atualização autônoma foi iniciada e bloqueada no apt. Isso fará com que o manual pare.

Eu tentei muitas maneiras de contornar isso, a mais bem sucedida foi a repetição de um comando apt com falha.

Mas isso não escala, também não é 100% confiável e parece ruim.

Eu optei por emitir um apt -y purge unattended-upgrades logo no início do playbook. Eu também tentei apt -y remove unattended-upgrades , mas esse parece retornar enquanto ainda está no trabalho. A limpeza parece desligar as atualizações automáticas como antes de sair, que é o que eu quero.

Mas acontece que mesmo essa chamada para apt -y purge unattended-upgrades pode falhar devido ao bloqueio. Então eu mudei para while [[ $(dpkg -l | grep -P "unattended-upgrades" | wc -c) -ne 0 ]]; do apt -y purge unattended-upgrades; done , mas também que falha ocasionalmente (não consigo descobrir por que)

Eu preciso de um comando que, quando executado, encerre e enterre atualizações autônomas imediatamente, independentemente de estar ou não em execução, e garanta que ele não será iniciado assim que o comando retornar, até que eu explique explicitamente apt install novamente. Está tudo bem se esse comando demorar um minuto para terminar seu trabalho.

Além disso, o sistema não tem o Python instalado, então o Ansible está emitindo apenas comandos raw , até que eu consiga instalar o Python, que deve ser depois de uma chamada bem-sucedida para apt -y update

Estou em um estado em que posso acionar atualizações autônomas facilmente, já que isso é uma VM, e assim que eu emito um comando date -s para corrigir a data obsoleta, a atualização automática entra em ação. Depois de iniciar a VM, Eu tenho alguns minutos até que o date se corrija automaticamente, o que inicia atualizações autônomas.

Isso é o que estou fazendo agora:

- 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

Terminar o dpkg é o que me assusta. Tudo o que é executado em uma nova instalação do Ubuntu Server 18.04.1

Aqui está a solução criada usando a resposta link

    
por Daniel F 19.08.2018 / 15:19

1 resposta

6

Aparentemente, o unattended-upgrades é executado a partir de uma das unidades systemd apt-daily.service / apt-daily-upgrade.service. (Estes, por sua vez, são acionados por unidades systemd .timer , com os mesmos nomes).

Você pode tentar esperar pelas unidades do systemd da seguinte forma:

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

Isso é independente de você querer enviar SIGTERM para dpkg ou apt-get ou algo assim para tentar concluí-los mais rapidamente. kill apenas transmite um sinal; não espera nada. Em princípio, você sempre precisa esperar um pouco antes de usar o recurso liberado.

    
por 19.08.2018 / 15:38