能否用Ansible模块升级Ansible?升级后任务执行异常求助
能否用Ansible模块升级Ansible本身?
首先直接给出结论:可以,但选对模块和执行方式很关键——你遇到的raw模块执行后报错问题,核心原因是控制端与被控端的Ansible版本兼容性冲突。
为什么pip模块能成功?
你测试的这段pip模块写法是完全可行的:
- pip: name: ansible version: <ansible_version> extra_args: '--ignore-installed'
原因在于:
- Ansible的
pip模块是通过受控的Python子进程执行安装操作,它会规避对当前正在运行的Ansible进程依赖链的直接破坏。不管是升级控制节点还是远程节点的Ansible,这个模块的执行逻辑都和Ansible的核心运行环境兼容,不会触发即时的版本冲突。 --ignore-installed参数强制覆盖现有版本,确保安装的是你指定的目标版本,避免依赖残留问题。
为什么raw模块会引发后续任务失败?
你用raw模块执行:
- raw: pip install ansible==<ansible_version>
后出现的ImportError: cannot import name AnsiblePlugin、TypeError: mkdtemp() takes at most 4 arguments (5 given)甚至任务挂起,根源是控制节点的Ansible版本与远程节点的模块版本不匹配:
raw模块是直接在远程节点执行原生Shell命令,完全绕过了Ansible的模块调度系统。当你用它升级远程节点的Ansible后,远程节点上的所有Ansible模块(比如command、copy)都变成了新版本,但控制节点仍在使用旧版本的Ansible发送任务指令。- 不同版本的Ansible控制端与模块端的API存在差异,比如旧版本控制端传递的参数格式、依赖的类结构,和新版本模块的要求不匹配,就会引发导入错误、参数错误,甚至因通信协议不兼容导致任务挂起。
最佳实践建议
升级控制节点的Ansible:
- 不要把升级控制节点Ansible的任务放到长剧本中,因为升级后当前运行的Ansible进程依赖的库被替换,后续任务大概率会崩溃。
- 单独执行升级任务,比如:
ansible localhost -m pip -a "name=ansible version=<your_target_version> extra_args='--ignore-installed'" - 执行完成后退出当前Ansible进程,重新启动即可使用新版本。
升级远程节点的Ansible:
- 优先用
pip模块而非raw模块,确保Ansible的模块系统能处理版本过渡的兼容性。 - 如果必须用
raw模块,升级完成后一定要添加meta: reset_connection任务重置连接,让控制节点重新识别远程节点的环境,或者确保控制节点的Ansible版本与远程节点升级后的版本一致。
- 优先用
内容的提问来源于stack exchange,提问作者Akif
相关产品推荐
相关产品推荐

