I'm having an issue here where I try to automate a setup with Ansible.
Some of the steps require interaction with apt
, but occasionally I get an error because unattended-upgrade kicked off and locked apt. This will make the playbook stop.
I've tried many ways around this, the most successful being the repetition of a failed apt command.
But this does not scale, is also not 100% reliable and feels bad.
I've opted to issue an apt -y purge unattended-upgrades
right at the beginning of the playbook. I also tried apt -y remove unattended-upgrades
, but that one seems to return while it is still at work. Purging appears to shut down unattended upgrades as before it exits, which is what I want.
But it turns out that even that call to apt -y purge unattended-upgrades
can fail due to locking. So I changed it to while [[ $(dpkg -l | grep -P "unattended-upgrades" | wc -c) -ne 0 ]]; do apt -y purge unattended-upgrades; done
, but also that fails occasionally (I can't figure out why)
I need one command which, when executed, will terminate and bury unattended upgrades immediately, regardless if it is running or not, and make the guarantee that it won't start anymore as soon as that command returns, until I explicitly apt install
it again. It is ok if that command takes a minute to finish it's job.
Also, the system doesn't have Python installed, so Ansible is only issuing raw
commands, until I manage to install Python which should be after a successful call to apt -y update
I am in a state where I can trigger unattended upgrades easily, since this is a VM, and as soon as I issue a date -s
command to correct the stale date, unattended-upgrade kicks in. After starting the VM, I have a couple of minutes until date
corrects itself automatically which then starts unattended-upgrades.
This is what I'm doing now:
- 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
Terminating dpkg is what creeps me out. All that is run on a fresh install of Ubuntu Server 18.04.1
Here is the solution created by using the accepted answer:
apt dist-upgrade
(with the exception ofgit
because I need that one early and sometimes it isn't installed). I hope that's OK. – Daniel F Aug 19 '18 at 13:34aptitude purge unattended-upgrades
ordpkg --purge unattended-upgrades
– Rui F Ribeiro Aug 19 '18 at 13:38dpkg --purge unattended-upgrades
instead ofapt -y purge unattended-upgrades
(which I'm doing now)? – Daniel F Aug 19 '18 at 13:42apt-get
in scripts, so that the interactiveapt
program has full freedom to change behaviour to make it more friendly. – sourcejedi Aug 19 '18 at 13:44ubuntu-18.04.1-live-server-amd64.iso
and it has no/usr/bin/python
. It asks me to install it if I type python in the shell. – Daniel F Aug 19 '18 at 13:58python
, ubuntu1804 only haspython3
. https://linuxconfig.org/install-python-2-on-ubuntu-18-04-bionic-beaver-linux / https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#managed-node-requirements – sourcejedi Aug 19 '18 at 13:58apt
module, there I was using retry stuff which was making me instane so that I opted for a real solution. ATM my first tests show that sourcejedi'swait
command is the solution. – Daniel F Aug 19 '18 at 14:17