Python not found in Ubuntu 16.04 server

I’m trying to provision a Ubuntu 16.04 server machine. When running a playbook which has worked fine on Ubuntu 14.x and 15.x, it fails with this error:

TASK [setup] *******************************************************************
fatal: [foo]: FAILED! => {“changed”: false, “failed”: true, “module_stderr”: “”, “module_stdout”: “/bin/sh: 1: /usr/bin/python: not found\r\n”, “msg”: “MODULE FAILURE”, “parsed”: false}

Ubuntu 16.04 has python3, not 2.7.x. Why is this not being autodetected?

No Ansible support for Python 3 just yet.

  https://docs.ansible.com/ansible/faq.html#how-do-i-handle-python-pathing-not-having-a-python-2-x-in-usr-bin-python-on-a-remote-machine

For Ubuntu 16.04 I use the following play to get Python 2.7 installed.

  - hosts: xenials
gather_facts: False
tasks:
- name: apt-get update
raw: apt-get update -qq
- name: Install python 2.7
raw: apt-get install -qq python2.7

That provides an /usr/bin/python2.7, which I explicitly point to in my
inventory file.

  [xenials:vars]
  ansible_python_interpreter=/usr/bin/python2.7

Do note that there is nothing special about the name xenials. It's just
a group I have defined in my inventory.

// Andreas

You can’t see it, but this is me banging my face into my desk. No support for Python 3? It’s been out how long?

Sigh. The principal reason I prefer to use Ansible over Chef is that I DON’T need to install anything on the client to make it go. This release of Ubuntu is going to be everywhere shortly. Maybe Canonical dropping Python 2 from the distro is the wrong thing to have done, but that die is cast…

I just want to confirm, that I got this working with Andreas’ instructions.

I just added these lines to my inventory file:

[xenials] # Ubuntu 16.04 hosts without python2
myhost.example.org ansible_user=root

[xenials:vars]
ansible_python_interpreter=/usr/bin/python2.7

[server] # This already existed
myhost.example.org ansible_user=root

And these to my init.yml:

- hosts: xenials
gather_facts: False
tasks:
- name: apt-get update
raw: apt-get update -qq
- name: Install python 2.7
raw: apt-get install -qq python2.7

Thanks Andreas!

It’s coming, but there are a lot of hoops to jump to make Py3 work while continuing to support back to Python 2.4 in modules (eg, RHEL5 support). It sounds like RHEL will likely do the same for RHEL8, and others too… Life would be much easier if we could just say, Py2.6/2.7/3.4+, but we’d have at least as much hollering from the crowd that’s still supporting RHEL5 and other “legacy” distros.

We’re definitely not ignoring the problem- a lot of groundwork was laid for Py3 compat in 2.1 (on both control and module side), and it’ll likely be a major theme of 2.2.

-Matt

Andreas, when I implemented this, I had to put a line in the section to use sudo for the installation, which makes sense, just wondering if you had achieved that another way , just curious.

I initially did these manually for testing, but this is obviously a much better solution for large scale roll outs, without having to update the AMI first.

Thanks for the post.

Cheers

Nick

Andreas, when I implemented this, I had to put a line in the section
to use sudo for the installation, which makes sense, just wondering
if you had achieved that another way , just curious.

Yepp, I have the following in my ansible.cfg

[privilege_escalation]
become = True

(Where sudo is the default become_method)

Thanks for the post.

Glad it helped!

// Andreas