I have encountered an unexpected Ansible failure today that turned out to be not a bug.
Ansible apt module had failed to auto install the required python3-apt
package - only on Debian Testing. Same playbook worked fine with Debian
Stable.
TASK [install some apt packages] *********************************************
[WARNING]: Updating cache and auto-installing missing dependency: python3-apt
ok: [debian10]
fatal: [debian11]: FAILED! => changed=false
msg: 'Could not import python modules: apt, apt_pkg. Please install python3-apt package.'
After some troubleshooting I've been able to find the reason for this failure:
Python interpreter was being automatically upgraded to the next minor version
while installing python3-apt
.
Since the apt_pkg
module is distributed as compiled platform-specific binary
(e.g. apt_pkg.cpython-37m-x86_64-linux-gnu.so
), it is only compatible with
Python version it's been built for. In my case the Python interpreter at the
moment of Ansible module invocation was at version 3.8.6, but doing
apt update; apt install python3-apt
had upgraded it to 3.9.1 and installed
apt_pkg
was only compatible with new version of interpreter.
Ansible apt module was still running under the old version of interpreter and
therefore was unable to import apt_pkg
that it had just installed.
Such errors are a non-issue on Debian Stable where Python is never upgraded to the next upstream version, and even in Testing/Sid it's a rare occurence. More than that, I see no way to add a workaround to the Ansible module that could allow it to handle this edge case: the whole module is executed with one instance of Python interpreter and it can not accomodate such change in a single invocation.
The solution I see is to explicitly install python3-apt
on Debian
Testing/Sid systems before invoking apt module with Ansible. This can either
be done with raw
module or with the provisioning tools (machine template,
preseed, terraform/packer/etc).