解决 Ansible playbook 错误: ‘Collection’ object is not callable

85次阅读
没有评论

问题描述

在学习使用 Ansible 配置 MongoDB 时,在本地的 Vagrant 虚拟机上设置了一个 Ansible playbook,但是在执行过程中遇到了以下错误:

An exception occurred during task execution. To see the full traceback, use -vvv. The error was: TypeError: 'Collection' object is not callable. If you meant to call the 'authenticate' method on a 'Database' object it is failing because no such method exists.
fatal: [192.168.56.11]: FAILED! => {"changed": false, "module_stderr": "Shared connection to 192.168.56.11 closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/vagrant/.ansible/tmp/ansible-tmp-1640759955.2153473-3678-226245830655855/AnsiballZ_mongodb_user.py\", line 107, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/vagrant/.ansible/tmp/ansible-tmp-1640759955.2153473-3678-226245830655855/AnsiballZ_mongodb_user.py\", line 99, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/vagrant/.ansible/tmp/ansible-tmp-1640759955.2153473-3678-226245830655855/AnsiballZ_mongodb_user.py\", line 47, in invoke_module\r\n  ...

错误信息中的一部分表明以下操作是出错的:

- name: Create the application user
  mongodb_user:
    login_user: root
    login_password: "{{ dbpass }}"
    database: "{{ dbname }}"
    name: "{{ appdbuser }}"
    password: "{{ appdbpass }}"
    roles: dbOwner
    state: present

解决方案

这个错误可能与你正在使用的 Ansible MongoDB Collection 以及 pymongo 版本的兼容性有关。目前,Ansible 的 community.mongodb Collection 版本(例如 v1.3.2)可能不兼容 pymongo 4.x 版本。要解决这个问题,你可以尝试以下解决方案:

方案1:降级 pymongo 版本

由于当前的 Ansible MongoDB Collection 版本可能不兼容 pymongo 4.x 版本,你可以将 pymongo 版本降级到 3.x。这样可以避免与 Ansible Collection 的兼容性问题。以下是一些可能的步骤:

  1. 在你的目标主机上,卸载当前安装的 pymongo 4.x 版本。
  2. 安装 pymongo 3.x 版本。你可以使用以下命令:

bash
pip install pymongo==3.12.1

  1. 在运行 Ansible playbook 之前,确保 pymongo 已经降级到了 3.x 版本。

方案2:等待修复

如果你想继续使用 pymongo 4.x 版本,你可以等待 Ansible community.mongodb Collection 更新,以适应 pymongo 4.x 版本。根据用户评论,最新的提交已经在修复这个问题,并将库版本固定为了 3.12.2。你可以随着更新的发布来升级 Ansible Collection,以解决兼容性问题。

另外,开发者已经在 GitHub 上创建了一个分支来适配 pymongo 4.x 版本,你可以在 这里 查看相关进展。

请注意,解决这个问题可能需要根据具体情况选择不同的方法,例如降级 pymongo 版本或等待 Ansible Collection 的更新。在选择解决方案之前,请确保备份相关数据以及配置文件。

注意:本解决方案中提到的操作可能会因版本差异或其他因素而产生变化,请在实际操作前确保充分了解和备份。

总结

在使用 Ansible 配置 MongoDB 时,可能会遇到与 pymongo 版本兼容性相关的问题。如果遇到上述错误,可以考虑降级 pymongo 版本或等待 Ansible Collection 更新来解决。根据具体情况选择最适合的解决方案,以确保成功配置 MongoDB。

正文完