新闻详情

新闻详情

首页 / 资讯中心 / 详情

Ansible 自定义模块如何处理错误?直接 raise 异常与 fail_json 的正确用法

发布时间:2026/9/9 22:19:21来源:尧图网络
Ansible 自定义模块如何处理错误?直接 raise 异常与 fail_json 的正确用法
Ansible 自定义模块如何处理错误直接 raise 异常与 fail_json 的正确用法【免费下载链接】ansibleAnsible is a radically simple IT automation platform that makes your applications and systems easier to deploy and maintain. Automate everything from code deployment to network configuration to cloud management, in a language that approaches plain English, using SSH, with no agents to install on remote systems. https://docs.ansible.com.项目地址: https://gitcode.com/GitHub_Trending/ans/ansible开发自定义 Python 模块时最常见的困惑是模块内部出错时到底该raise异常还是调用fail_json返回Ansible 当前的做法是——大多数情况下直接 raise 异常即可。AnsiballZ 包装器为 Python 模块提供了通用的异常处理器模块抛出的异常会被自动捕获并转换成标准的失败结果fail_json只在需要自定义模块返回结果时才必须使用。这篇文章基于仓库内的 context/error-handling.md 规范文档和 fail_json 实现给出两种写法的适用边界和验证方法。什么时候可以直接 raise 异常context/error-handling.md 中 In modules 一节给出的原则是In most cases, just raise an exception. The AnsiballZ wrapper now provides a general exception handler for Python modules, making use offail_jsonunnecessary, unless the module result needs to be customized.也就是说如果你只需要让任务失败、并把错误信息传回 controller直接抛异常就是正确写法if not os.path.exists(path): raise Exception(Configuration file not found: %s % path)配套的两条纪律同样来自该文档不要为了重新抛出而捕获异常Dont catch exceptions just to re-raise them除非新异常里能补充额外信息。对插件/模块失败而言上下文信息会自动附加细粒度的try/except/raise通常没有必要。不要在新异常中重复旧异常的 message。例如raise Exception(it broke: {ex}) from ex是文档明确列出的反模式因为 Ansible 内置的错误链机制会自动带上 cause/context 异常的消息。需要自定义失败结果时用 fail_jsonfail_json定义在 lib/ansible/module_utils/basic.py行为是在结果中写入failedTrue和msg清理临时文件后以退出码 1 结束成功返回对应的是exit_json退出码 0。当你需要往失败结果里塞额外的键值比如带上rc、cmd、stdout、details等字段才用fail_json这也是内置模块的典型写法例如basic.py中执行命令失败时self.fail_json(cmdself._clean_args(args), rcrc, stdoutstdout, stderrstderr, msgmsg)fail_json的exception参数有四种取值语义直接来自源码 docstring按需要选exception取值行为异常对象自动把异常的消息链含__cause__链上的消息与msg合并并用该异常的 traceback 生成格式化 traceback字符串直接作为格式化后的 traceback 写入结果None使用当前调用栈作为格式化 traceback不传默认从当前 pending 的异常获取格式化 traceback没有 pending 异常时退回当前调用栈注意两点限制traceback 只有在启用了错误 traceback 捕获时才会出现在结果里对应配置项是DISPLAY_TRACEBACK见 context/error-handling.md Tracebacks 一节。文档明确说明使用fail_json自定义失败结果时不需要再传exception参数来提供当前活跃的异常——不传时实现会自动处理见上表最后一行。延迟处理异常时try/except fail_json如果异常需要在try块里捕获、在别处再转换为模块失败deferred exception文档要求的写法是把捕获到的Exception实例通过exception参数传给fail_jsontry: result parse_config(path) except Exception as ex: module.fail_json(msgFailed to parse %s % path, exceptionex)错误细节收集和 traceback 格式化会由错误处理基础设施完成模块代码不用自己拼 traceback 文本。异常上下文优先用 raise from在另一个异常仍然活跃时再抛新异常原异常会成为新异常的__context__这通常不是想要的行为。文档要求大多数情况使用raise from并给出两个示例写法# 抑制原异常它没有帮助时 raise Exception(something) from None # 把捕获的异常设为新异常的 __cause__ raise Exception(something) from exraise from ex与上面fail_json(exceptionex)的消息链机制对应链路上的消息会被自动合并所以新异常的 message 只需简短描述发生了什么不要塞诊断信息或修复建议。需要用户可读的错误指引时用 AnsibleErrorAnsibleError支持message之外的两个参数来自 context/error-handling.md When and how to use AnsibleError 一节obj—— 通常是导致出错的变量本身不是Exception实例。如果该值带有Origin标记展示给用户的错误信息会带上触发错误的内容上下文。help_text—— 帮助用户理解如何解决错误的说明文字会显示在obj提供的上下文细节之后。这样message可以保持简短、只聚焦问题本身。文档同时提醒如果除了 message 之外不传其他参数用内置异常类型效果相同AnsibleError并没有额外收益。另外Display对象的warning和deprecated方法现在也接受help_text和obj参数新增的error_as_warning方法可以直接接收一个异常对象把捕获的异常转成 warning同时保留异常细节、traceback 和源对象上下文。如何本地验证模块的错误处理不需要跑完整 playbook 就能验证模块行为仓库自带 hacking/test-module.py 脚本脚本头部说明它是for testing modules without running through the entire guts of ansible。用法来自脚本头部注释模块路径替换为你要测试的模块文件路径-a后跟模块参数字符串./hacking/test-module.py -m lib/ansible/modules/command.py -a /bin/sleep 3常用选项脚本parse()中的定义-c/--check以 check mode 运行模块-n/--noexecute只生成不执行用于排查打包问题-o/--output把输出写入指定文件-D/--debugger指定 Python 调试器路径如/usr/bin/pdb。验证要点故意触发你写的失败分支观察脚本输出的 JSON——直接raise的异常应呈现为带消息的标准失败结果启用DISPLAY_TRACEBACK时能看到捕获的 tracebackfail_json的自定义键值应原样出现在结果中且没有重复拼接旧的异常消息。边界与例外Jinja 插件AnsibleFilterError和AnsibleLookupError这两个异常类型已不再需要按错误条件选择合适类型的普通异常即可。不要手工生成 tracebackcontroller 端和模块端Python的错误、警告、弃用警告都有标准化的 traceback 捕获是否展示由DISPLAY_TRACEBACK配置项控制。Jinja 之外的模块warn/deprecate方法调用同样会把 traceback 整理后传回 controller需启用捕获。参考文件规范见 context/error-handling.mdfail_json/exit_json实现见 lib/ansible/module_utils/basic.py本地验证工具见 hacking/test-module.py。【免费下载链接】ansibleAnsible is a radically simple IT automation platform that makes your applications and systems easier to deploy and maintain. Automate everything from code deployment to network configuration to cloud management, in a language that approaches plain English, using SSH, with no agents to install on remote systems. https://docs.ansible.com.项目地址: https://gitcode.com/GitHub_Trending/ans/ansible创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

STM32 HAL库 MPU6050驱动:从I2C配置到姿态解算的完整实践 2026/9/9 23:01:33

STM32 HAL库 MPU6050驱动:从I2C配置到姿态解算的完整实践

简介:这是一份基于STM32F103C8T6与HAL库的MPU6050六轴传感器驱动工程,适合嵌入式入门开发者学习外设驱动与姿态解算。工程完整实现了通过I2C读取MPU6050原始数据,加载DMP固件解算姿态角,并经UART1串口输出的全过程,可直…

阅读更多 →
FastAPI 多模型实战:用 UserIn/UserOut 分离、Pydantic 继承与 Union/list/dict 构建清晰的数据层 2026/9/9 23:01:33

FastAPI 多模型实战:用 UserIn/UserOut 分离、Pydantic 继承与 Union/list/dict 构建清晰的数据层

FastAPI 多模型实战:用 UserIn/UserOut 分离、Pydantic 继承与 Union/list/dict 构建清晰的数据层 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Tre…

阅读更多 →
PDF.js 如何在 HiDPI 屏幕上把 PDF 页面渲染得清晰?(devicePixelRatio 与 viewport 缩放) 2026/9/9 23:01:33

PDF.js 如何在 HiDPI 屏幕上把 PDF 页面渲染得清晰?(devicePixelRatio 与 viewport 缩放)

PDF.js 如何在 HiDPI 屏幕上把 PDF 页面渲染得清晰?(devicePixelRatio 与 viewport 缩放) 【免费下载链接】pdf.js PDF Reader in JavaScript 项目地址: https://gitcode.com/gh_mirrors/pd/pdf.js 在浏览器里用 canvas 渲染 PDF 页面…

阅读更多 →
iOS沙盒文件操作与WKWebView实战:从离线包到JS交互 2026/9/9 23:01:33

iOS沙盒文件操作与WKWebView实战:从离线包到JS交互

简介:面向iOS开发者的文件操作与WKWebView学习资源,围绕沙盒目录管理、数据持久化及网页加载交互两大主题,适合需要系统掌握原生文件读写与WKWebView集成的中初级开发者,也可作为项目开发初期的参考模板。压缩包共224个文件&#…

阅读更多 →
数据服务自动化测试:从接口验证到数据基线管理的实践指南 2026/9/9 23:01:33

数据服务自动化测试:从接口验证到数据基线管理的实践指南

做数据中台测试的这两年,我最大的感受就是:如果把普通接口自动化那套思路直接套到数据服务上,十有八九要翻车。数据服务测试难,难在它是个“活”系统——线上接口返回的每一个数字,背后都牵着十几张表、若干个调度任务…

阅读更多 →
Halo 控制台分类树管理重构:以 `spec.parent` 为基准的 Console 树 API 与单次位置更新设计 2026/9/9 22:58:33

Halo 控制台分类树管理重构:以 `spec.parent` 为基准的 Console 树 API 与单次位置更新设计

Halo 控制台分类树管理重构:以 spec.parent 为基准的 Console 树 API 与单次位置更新设计 【免费下载链接】halo Halo 是一款强大易用的开源建站工具,从个人博客、知识库,到企业官网、在线商城,Halo 都能助您轻松实现,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞