Not able to execute python3.8 code with ansible

Question:

I have a playbook:

---
- hosts: all
  gather_facts: true

  tasks:
    - name: test
      shell:
        cmd: python /tmp/test.py
        chdir: /tmp/
      async: 150
      poll: 5
      become: true
      register: test
    - debug: msg={{test}}

Below is the host file for me:

xx.xxx.xxx.xx ansible_ssh_user=xxx ansible_ssh_pass=xxxxxxxxxxxxxxx ansible_sudo_pass=xxxxxxxxxxxxxxx ansible_ssh_common_args='-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' ansible_python_interpreter=/usr/bin/pytho3.8

Below is the python code:

import time
print("Hello World")
time.sleep(5)

Before upgrade to python3.8, it was working till 3.6. But after upgrading to python3.8, I am getting below error:

ERROR! Unexpected Exception, this is probably a bug: invalid syntax (__init__.py, line 96)
the full traceback was:

Traceback (most recent call last):
  File "/usr/local/bin/ansible-playbook", line 106, in <module>
    exit_code = cli.run()
  File "/usr/local/lib/python3.8/dist-packages/ansible/cli/playbook.py", line 122, in run
    results = pbex.run()
  File "/usr/local/lib/python3.8/dist-packages/ansible/executor/playbook_executor.py", line 82, in run
    pb = Playbook.load(playbook_path, variable_manager=self._variable_manager, loader=self._loader)
  File "/usr/local/lib/python3.8/dist-packages/ansible/playbook/__init__.py", line 54, in load
    pb._load_playbook_data(file_name=file_name, variable_manager=variable_manager)
  File "/usr/local/lib/python3.8/dist-packages/ansible/playbook/__init__.py", line 106, in _load_playbook_data
    entry_obj = Play.load(entry, variable_manager=variable_manager, loader=self._loader)
  File "/usr/local/lib/python3.8/dist-packages/ansible/playbook/play.py", line 117, in load
    return p.load_data(data, variable_manager=variable_manager, loader=loader)
  File "/usr/local/lib/python3.8/dist-packages/ansible/playbook/base.py", line 255, in load_data
    self._attributes[name] = method(name, ds[name])
  File "/usr/local/lib/python3.8/dist-packages/ansible/playbook/play.py", line 147, in _load_tasks
    return load_list_of_blocks(ds=ds, play=self, variable_manager=self._variable_manager, loader=self._loader)
  File "/usr/local/lib/python3.8/dist-packages/ansible/playbook/helpers.py", line 71, in load_list_of_blocks
    Block.load(
  File "/usr/local/lib/python3.8/dist-packages/ansible/playbook/block.py", line 90, in load
    return b.load_data(data, variable_manager=variable_manager, loader=loader)
  File "/usr/local/lib/python3.8/dist-packages/ansible/playbook/base.py", line 255, in load_data
    self._attributes[name] = method(name, ds[name])
  File "/usr/local/lib/python3.8/dist-packages/ansible/playbook/block.py", line 118, in _load_block
    return load_list_of_tasks(
  File "/usr/local/lib/python3.8/dist-packages/ansible/playbook/helpers.py", line 341, in load_list_of_tasks
    t = Task.load(task_ds, block=block, role=role, task_include=task_include, variable_manager=variable_manager, loader=loader)
  File "/usr/local/lib/python3.8/dist-packages/ansible/playbook/task.py", line 139, in load
    return t.load_data(data, variable_manager=variable_manager, loader=loader)
  File "/usr/local/lib/python3.8/dist-packages/ansible/playbook/base.py", line 245, in load_data
    ds = self.preprocess_data(ds)
  File "/usr/local/lib/python3.8/dist-packages/ansible/playbook/task.py", line 179, in preprocess_data
    (action, args, delegate_to) = args_parser.parse()
  File "/usr/local/lib/python3.8/dist-packages/ansible/parsing/mod_args.py", line 289, in parse
    if item in module_loader or item in action_loader or item in ['meta', 'include', 'include_tasks', 'include_role', 'import_tasks', 'import_role']:
  File "/usr/local/lib/python3.8/dist-packages/ansible/plugins/loader.py", line 323, in has_plugin
    return self.find_plugin(name) is not None
  File "/usr/local/lib/python3.8/dist-packages/ansible/plugins/loader.py", line 265, in find_plugin
    for path in (p for p in self._get_paths() if p not in self._searched_paths and os.path.isdir(p)):
  File "/usr/local/lib/python3.8/dist-packages/ansible/plugins/loader.py", line 176, in _get_paths
    ret.extend(self._get_package_paths(subdirs=subdirs))
  File "/usr/local/lib/python3.8/dist-packages/ansible/plugins/loader.py", line 141, in _get_package_paths
    m = __import__(self.package)
  File "/usr/local/lib/python3.8/dist-packages/ansible/plugins/action/__init__.py", line 96
    if self._task.async and not self._supports_async:
                  ^
SyntaxError: invalid syntax

I have to use python3.8 only. So please let me know the changes I need to make in my code or any other configuration changes. I am using ansible version 2.4.6.0 .

Asked By: Aadhi Verma

||

Answers:

The error is related to the use of the async keyword, which is a reserved keyword in Python 3.7 and later versions.

To fix this issue, you need to upgrade ansible to a version that supports python 3.8

Starting with version 2.9, Ansible supports Python 3.8, so any version of Ansible from 2.9 and higher will be compatible with Python 3.8

Answered By: Yaseen