调用 ansible2时没有定义 name‘ basestring’

我正在执行命令。

当我这样做:

ansible-playbook -vvv -i my/inventory my/playbook.yml

我得到了:

未定义名称‘ basestring’ 完整的追踪结果是:

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

以下是 ansible --version:

ansible 2.0.0.2
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides

这是 python --version

Python 3.4.3
80291 次浏览

版本2.5以下的版本需要在控制主机 控制节点要求上使用 Python 2.6或2.7

basestring在 Python3中不再可用:

内建的 basestring抽象类型被删除。使用 str代替。strbytes类型没有足够的共同功能来保证共享基类。2to3工具(见下文)用 str代替每次出现的 basestring

因此,解决方案是要么升级 Anble,要么降级 Python。

Basestring 在 Python3中不可用。 :

对于 python 2.x 和3.x,可以使用以下代码修复这个问题:

try:
basestring
except NameError:
basestring = str

我遇到了这个问题,使用 Python 3和 Anable,通过分叉拷贝项目和安装拷贝到我的 anable 脚本,解决了这个问题:

name: git+https://github.com/eodgooch/dopy@0.4.0#egg=dopy.

如果仍然出现错误,请确保将 version更改为 0.4.0,并从 Python 站点包目录中删除任何延迟的复制包。

你也可以用 pip3 install git+https://github.com/eodgooch/dopy@0.4.0#egg=dopy代替你的感知任务。

用 str 替换 basestring。在2.x 中有 basestring。但是在3.x 中,basestring 被替换为“ str”。

问题可能是由于 Python 版本造成的。在2.x 中,基字符串是存在的,但是在3.x 中,它被替换为“ str”。

另一种可能的解决方案是通过 pip install future安装 future并导入 from past.builtins import basestring

from past.builtins import basestring

就个人而言,我并不热衷于这个解决方案,因为:

  1. 它需要安装另一个依赖项。
  2. 很可能还有其他混合了 Python 3和2代码的向下兼容问题。
  3. 它将只在您的代码中工作-您不希望修改安塞尔源代码。

我之所以提供它,仅仅是因为它是我过去用来使我自己的代码在 Python2和3中都能工作的东西。