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 a cartilha pare.
Eu tentei muitas maneiras de contornar isso, sendo a mais bem-sucedida a repetição de um comando apt com falha.
Mas isso não escala, também não é 100% confiável e parece ruim.
Optei por emitir um apt -y purge unattended-upgrades
direito no início do manual. Eu também tentei apt -y remove unattended-upgrades
, mas esse parece retornar enquanto ainda está no trabalho. A limpeza parece encerrar as atualizações autônomas 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 isso falha ocasionalmente (não consigo descobrir o porquê)
Eu preciso de um comando que, quando executado, encerrará e enterrará atualizações autônomas imediatamente, independentemente de estar em execução ou não, e garantirá que não será mais iniciado assim que o comando retornar, até que eu apt install
o explicitamente novamente. 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á apenas emitindo raw
comandos, até eu conseguir instalar o Python, que deve ser após uma chamada bem-sucedida paraapt -y update
Estou em um estado em que posso acionar atualizações autônomas facilmente, pois esta é uma VM, e assim que eu emitir um date -s
comando para corrigir a data obsoleta, a atualização autônoma é iniciada. Depois de iniciar a VM, tenho alguns minutos até date
que se corrija automaticamente, o que inicia atualizações autônomas.
Isto é 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 aceita:
Aparentemente
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:
Isso independe de você querer enviar SIGTERM para
dpkg
ouapt-get
ou algo para tentar fazer com que eles terminem mais rápido.kill
apenas transmite um sinal; não espera por nada. Em princípio, você sempre precisa esperar um pouco antes de poder usar o recurso liberado.