Ansible 2.11 升级后 callback 插件报 ImportError,通常是因为控制器 Python 版本低于 3.8 或插件配置方式不再兼容。优先检查运行环境 Python 版本,并将 ansible.cfg 中的 callback_whitelist 改为 enable_callback_plugins。
先说结论:环境不兼容或配置废弃导致导入失败。
- 先确认 Python 版本是否满足 3.8+
- 先处理 ansible.cfg 配置项替换
- 再验证 playbook 执行日志无报错
命令速用版
ansible `--version`
python3 `--version`为什么会这样
Ansible 2.11 移除了对旧版 Python 的支持并废弃了部分配置项。2.11 版本强制要求控制器使用 Python 3.8 或更高版本,同时配置项 callback_whitelist 被标记为废弃,改用 enable_callback_plugins,旧配置会导致插件加载逻辑异常。
分步处理
第一步检查控制器 Python 版本,执行 python3 `--version`,若低于 3.8 需升级解释器或创建新虚拟环境。
第二步修改 ansible.cfg 配置,找到 [defaults] 段落,将 callback_whitelist 替换为 enable_callback_plugins,确保插件名称列表一致。
第三步检查自定义插件代码,若插件内部导入 ansible.plugins.callback 下的私有模块,需调整为公共 API 或移除依赖,避免内部结构变更引发 ImportError。
怎么验证是否生效
执行任意 playbook 时添加 -v 参数,观察输出日志中是否仍有 ImportError traceback。
检查日志开头部分,确认 callback 插件名称已正确列出且无红色报错信息。
常见坑
虚拟环境未激活会导致调用了系统默认的低版本 Python,务必在运行 ansible 前 source 对应的虚拟环境。
插件目录路径大小写敏感,Linux 环境下 callback_plugins 文件夹名称必须与 ansible.cfg 配置完全一致。
常见问题
默认 callback 插件也报 ImportError 怎么办
检查是否误删了内置插件文件或权限不足,重新安装 ansible 核心包可恢复默认文件。
自定义插件修改后仍报错如何处理
清除 Python 缓存文件 .pyc 和 __pycache__ 目录,强制 Ansible 重新加载最新代码。
参考来源
- Ansible 官方发行说明,Ansible 2.11 Porting Guide,https://docs.ansible.com/ansible/2.11/porting_guides/porting_guide_2.11.html