Search code examples
pythonpython-3.xansibleinfluxdb

Ansible "ansible_python_interpreter" Error


I want to instal influxdb and configuration with ansible. File copy and influxdb configuration is ok But creating database and user create section is give a "ansible_python_interpreter" error.

I searched this error and tried something but I can't solve this problem with myself

This is my ansible hosts file

[loadbalancer]
lb      ansible_host=192.168.255.134

[loadbalancer:vars]
ansible_python_interpreter="/usr/bin/python3"
#ansible_python_interpreter="/usr/bin/env python"
#ansible_python_interpreter="/usr/libexec/platform-python"

This is my yaml file

# influxdb install and configuration

---
  - hosts: lb
    become: true
    tasks:
      - name: Copy Repo Files
        copy:
          src: ./files/influxdb.j2
          dest: /etc/yum.repos.d/influxdb.repo
          remote_src: no
      - name: Install Influxdb
        yum:
          name: influxdb
          state: latest
        notify:
             influxdb_ok
      - name: Crete Database
        community.general.influxdb_database:
          hostname: 192.168.255.134
          database_name: deneme
      - name: Create User
        community.general.influxdb_user:
          user_name: deneme_user
          user_password: deneme123

    handlers:
      - name: Start Influx Service
        service:
          name: influxdb
          state: started
          enabled: yes
        listen: influxdb_ok

I was tried to install python3 remote vm(lb). I was tried to change interpreter parameters. I was tried to install requests module with pip3.

[root@centos8 influx]# ansible-playbook influxdb.yaml -K
BECOME password:

PLAY [lb] ***********************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************
ok: [lb]

TASK [Copy Repo Files] **********************************************************************************************
ok: [lb]

TASK [Install Influxdb] *********************************************************************************************
ok: [lb]

TASK [Crete Database] ***********************************************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: ModuleNotFoundError: No module named 'requests'
fatal: [lb]: FAILED! => {"changed": false, "msg": "Failed to import the required Python library (requests) on loadbalancer.servicepark.local's Python /usr/bin/python3. Please read the module documentation and install it in the appropriate location. If the required library is installed, but Ansible is using the wrong Python interpreter, please consult the documentation on ansible_python_interpreter"}

PLAY RECAP **********************************************************************************************************
lb                         : ok=3    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

I was tried to install requests module and currently ansible version

Right now my ansible machine versions

[root@centos8 influx]# python3 --version
Python 3.6.8
[root@centos8 influx]# ansible --version
ansible 2.10.1
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.6.8 (default, Apr 16 2020, 01:36:27) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]

lb vm's versions

[root@loadbalancer ~]# influx --version
InfluxDB shell version: 1.8.2
[root@loadbalancer ~]# python3 --version
Python 3.6.8

Solution

  • There are 3 ways to solve this problem if you encounter it on your remote host:

    1. Set ansible_python_interpreter: /usr/bin/python3 variable for all hosts that have python3 installed by default
    2. Install Python 2 using Ansible’s raw module
    3. Symlink /usr/bin/python3 to /usr/bin/python using Ansible’s raw module.

    All 3 options can be done in Ansible, without sshing into the host.

    example

    - name: misc task on ubuntu 18.04 instance
      hosts: "*"
      vars:
        ansible_python_interpreter: /usr/bin/python3
      tasks:
        - debug: var=ansible_host
    

    Option 3 - Symlink /usr/bin/python -> /usr/bin/python3 using Ansible’s raw module Another option in a similar vein to option 2 is to use the raw module to “symlink” /usr/bin/python -> /usr/bin/python3.

    With a bit of shell magic, we can fashion a command to do this conditionally based on whether either of the files exist using conditionals:

    if [ -f /usr/bin/python3 ] && [ ! -f /usr/bin/python ]; then 
      ln --symbolic /usr/bin/python3 /usr/bin/python; 
    fi