Unexpected Exception: name 'basestring' is not defined when invoking ansible2
Question:
I’m trying to execute ansible2 commnads…
When I do:
ansible-playbook -vvv -i my/inventory my/playbook.yml
I get:
Unexpected Exception: name ‘basestring’ is not defined
the full traceback was:
Traceback (most recent call last):
File "/usr/local/bin/ansible-playbook", line 85, in <module>
sys.exit(cli.run())
File "/usr/local/lib/python3.4/site-packages/ansible/cli/playbook.py", line 150, in run
results = pbex.run()
File "/usr/local/lib/python3.4/site-packages/ansible/executor/playbook_executor.py", line 87, in run
self._tqm.load_callbacks()
File "/usr/local/lib/python3.4/site-packages/ansible/executor/task_queue_manager.py", line 149, in load_callbacks
elif isinstance(self._stdout_callback, basestring):
NameError: name 'basestring' is not defined
Here is ansible --version
:
ansible 2.0.0.2
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
And here is python --version
Python 3.4.3
Answers:
Ansible below version 2.5 requires Python 2.6 or 2.7 on the control host: Control Node Requirements
basestring
is no longer available in Python 3. From What’s New In Python 3.0:
The builtin basestring
abstract type was removed. Use str
instead. The str
and bytes
types don’t have functionality enough in common to warrant a shared base class. The 2to3
tool (see below) replaces every occurrence of basestring
with str
.
So the solution is to either upgrade Ansible or downgrade Python.
basestring is not available in Python 3.:
This can be fixed for python 2.x and 3.x with the following:
try:
basestring
except NameError:
basestring = str
I ran into this issue using Python 3 with Ansible and solved by forking the dopy project and installing dopy in my ansible script with:
name: git+https://github.com/eodgooch/[email protected]#egg=dopy
.
If you are still getting errors be sure to change the version
to 0.4.0
and remove any lingering dopy packages from your Python site-packages directory.
Also you could pip3 install git+https://github.com/eodgooch/[email protected]#egg=dopy
instead of in your Ansible Task.
Replace basestring with str. In 2.x basestring is there. but in 3.x the basestring has been replaced with “str”.
The problem might be due to python version. In 2.x, basestring is there but in 3.x it has been replaced with “str”.
Another possible solution is to install future
via pip install future
and import from past.builtins import basestring
.
from past.builtins import basestring
Personally, I’m not crazy about this solution because:
- It requires installing another dependency.
- There are likely other backward compatibility issues mixing Python 3 and 2 code.
- It will only work in your code – you don’t want to modify Ansible source code.
I offer it only because it’s something I’ve used in the past to make my own code work in both Python 2 and 3.
replace basestring with (str, bytes) and it should work perfectly
I’m trying to execute ansible2 commnads…
When I do:
ansible-playbook -vvv -i my/inventory my/playbook.yml
I get:
Unexpected Exception: name ‘basestring’ is not defined
the full traceback was:Traceback (most recent call last): File "/usr/local/bin/ansible-playbook", line 85, in <module> sys.exit(cli.run()) File "/usr/local/lib/python3.4/site-packages/ansible/cli/playbook.py", line 150, in run results = pbex.run() File "/usr/local/lib/python3.4/site-packages/ansible/executor/playbook_executor.py", line 87, in run self._tqm.load_callbacks() File "/usr/local/lib/python3.4/site-packages/ansible/executor/task_queue_manager.py", line 149, in load_callbacks elif isinstance(self._stdout_callback, basestring): NameError: name 'basestring' is not defined
Here is ansible --version
:
ansible 2.0.0.2
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
And here is python --version
Python 3.4.3
Ansible below version 2.5 requires Python 2.6 or 2.7 on the control host: Control Node Requirements
basestring
is no longer available in Python 3. From What’s New In Python 3.0:
The builtin
basestring
abstract type was removed. Usestr
instead. Thestr
andbytes
types don’t have functionality enough in common to warrant a shared base class. The2to3
tool (see below) replaces every occurrence ofbasestring
withstr
.
So the solution is to either upgrade Ansible or downgrade Python.
basestring is not available in Python 3.:
This can be fixed for python 2.x and 3.x with the following:
try:
basestring
except NameError:
basestring = str
I ran into this issue using Python 3 with Ansible and solved by forking the dopy project and installing dopy in my ansible script with:
name: git+https://github.com/eodgooch/[email protected]#egg=dopy
.
If you are still getting errors be sure to change the version
to 0.4.0
and remove any lingering dopy packages from your Python site-packages directory.
Also you could pip3 install git+https://github.com/eodgooch/[email protected]#egg=dopy
instead of in your Ansible Task.
Replace basestring with str. In 2.x basestring is there. but in 3.x the basestring has been replaced with “str”.
The problem might be due to python version. In 2.x, basestring is there but in 3.x it has been replaced with “str”.
Another possible solution is to install future
via pip install future
and import from past.builtins import basestring
.
from past.builtins import basestring
Personally, I’m not crazy about this solution because:
- It requires installing another dependency.
- There are likely other backward compatibility issues mixing Python 3 and 2 code.
- It will only work in your code – you don’t want to modify Ansible source code.
I offer it only because it’s something I’ve used in the past to make my own code work in both Python 2 and 3.
replace basestring with (str, bytes) and it should work perfectly