Chris Curvey
Chris Curvey

Reputation: 10399

how can I specify the version of Python to use in an Ansible playbook?

I'm working on a project that is still running Python 2. I'm trying to use Ansible to set up new test servers. The base Linux installation that I start with only has Python 3, so I need my very first "bootstrap" playbook to use Python 3, but then I want subsequent playbooks to use Python 2.

I can specify the version of python in my inventory file like this:

[test_server:vars]
ansible_python_interpreter=/usr/bin/python3

[test_server]
test_server.example.com

But then I have to go edit the inventory file to make sure that I'm using Python 3 for the bootstrap playbook, and then edit it again for the rest of my playbooks. That seems odd. I've tried a few different versions of changing ansible_python_interpreter within my playbooks, like

- hosts: test_server
    ansible_python_interpreter: /usr/bin/python

and

- hosts: test_server
  tasks:
    - name: install pip
      ansible_python_interpreter: /usr/bin/python
      apt:
        name: python-pip

but ansible complains that

ERROR! 'ansible_python_interpreter' is not a valid attribute for a Task

Even though https://docs.ansible.com/ansible/latest/reference_appendices/interpreter_discovery.html says that

You can still set ansible_python_interpreter to a specific path at any variable level (for example, in host_vars, in vars files, in playbooks, etc.).

What's the invocation to do this correctly?

Upvotes: 9

Views: 24650

Answers (1)

Vladimir Botka
Vladimir Botka

Reputation: 68254

Q: "What's the invocation to do this correctly?"

- hosts: test_server
  tasks:
    - name: install pip
      ansible_python_interpreter: /usr/bin/python
      apt:
        name: python-pip

ERROR! 'ansible_python_interpreter' is not a valid attribute for a Task


A: ansible_python_interpreter is not a Playbook keyword. It is a variable and must be declared as such. For example, in the scope of a task

- hosts: test_server
  tasks:
    - name: install pip
      apt:
        name: python-pip
      vars:
        ansible_python_interpreter: /usr/bin/python

, or in the scope of a play

- hosts: test_server
  vars:
    ansible_python_interpreter: /usr/bin/python
  tasks:
    - name: install pip
      apt:
        name: python-pip

, or in any other suitable place. See Variable precedence: Where should I put a variable?


See:

Notes:

configuration entry INTERPRETER_PYTHON_DISTRO_MAP is now 'private' and won't show up in normal configuration queries and docs, since it is not 'settable' this avoids user confusion.

Upvotes: 16

Related Questions