尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Salt JSON 输出模块(json_out)实战指南:从 CLI 参数到源码级缩进与解析原理
运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载导读Salt 的输出器outputter负责把 minion 返回的数据格式化成人类可读或机器可解析的文本。其中json_out模块将返回数据序列化为标准 JSON是脚本化、自动化对接 Salt 时最常用的输出器。本文以 salt.output.json_out.rst 为骨架结合 salt/output/json_out.py 源码、tests/pytests/unit/output/test_json_out.py 与 tests/pytests/integration/cli/test_salt_call.py 集成测试带你掌握--outjson的完整用法、--out-indent与output_indent的取值语义以及输出器在 Salt 内部的调度与序列化细节。一、模块定位Salt 的 JSON 输出器Salt 内置多种输出器highstate、json、key、nested、pprint、raw、txt、yaml等完整清单见 doc/ref/output/all/index.rst。json_out模块的虚拟名virtual name是json通过__virtual__()将模块重命名为json因此在命令行中写--outjson即可触发它见 salt/output/json_out.py。json_out的核心价值在于输出是标准 JSON任何语言的 JSON 解析器都能直接消费特别适合需要把 Salt 执行结果喂给 CI/CD、监控告警、自研 Web 平台的场景。二、触发方式命令行与配置双入口2.1 命令行指定所有 Salt CLIsalt、salt-call、salt-run、salt-key等都支持通用输出选项定义见 doc/ref/cli/_includes/output-options.rstsalt * test.ping --outjson salt * network.hw_addr en0 --outjson--out的取值见 salt/utils/parsers.py它映射到destoutput。2.2 配置文件中固化如果不希望每次敲命令都带参数可以在 Master 或 Minion 配置文件中设置output和output_indent例如conf/master、conf/minion。配置后所有输出默认走 JSON。三、缩进控制--out-indent 与 output_indent这是json_out文档中最核心的配置话题官方文档明确给出三种取值语义见 salt/output/json_out.py取值语义NullNone每个 minion 的返回结果合并为单行JSONpretty使用四空格缩进且对键排序sort_keys整数指定缩进级别空格数负数等价于单行3.1 通过 CLI 标志设置# 单行紧凑输出每 minion 一行适合逐行解析 salt * test.ping --outjson --out-indent-1 # 按空格数缩进 salt * test.ping --outjson --out-indent2 # 键排序 四空格缩进pretty salt-call test.ping --outjson --output-indentpretty--out-indent与--output-indent是同一选项的两个别名在 salt/utils/parsers.py 中声明destoutput_indent、typeint。注意CLI 层面它是整数类型所以pretty这种字符串取值只能通过配置文件output_indent设置。3.2 配置文件方式在conf/master或conf/minion中设置output: json output_indent: pretty # 或 None或整数四、按 minion 逐条输出的设计Salt 的输出器是按 minion 粒度工作的每个 minion 的返回数据到达 Master 后会被各自序列化为一个独立的 JSON 对象见 salt/output/json_out.py。$ salt * network.hw_addr en0 --outjson --out-indent-1 {dave: {en0: {hwaddr: 02:b0:26:32:4c:69, ...}}} {jerry: {en0: {hwaddr: 02:26:ab:0d:b9:0d, ...}}} {kevin: {en0: {hwaddr: 02:6d:7f:ce:9f:ee, ...}}} {mike: {en0: {hwaddr: 02:48:a2:4b:70:a0, ...}}} {phill: {en0: {hwaddr: 02:1d:cc:a2:33:55, ...}}} {stuart: {en0: {hwaddr: 02:9a:e0:ea:9e:3c, ...}}}官方文档特别提醒见 salt/output/json_out.py部分 JSON 解析器能猜出对象边界但很多不能。可靠的做法是使用单行输出格式逐行解析——每行一个完整 JSON 对象天然避免跨行截断问题。例如配合jqsalt * test.ping --outjson --out-indent-1 | jq -r keys[]五、源码级实现剖析5.1 output() 的缩进决策逻辑json_out.output(data, **kwargs)是模块入口见 salt/output/json_out.py其完整决策树如下若__opts__中不存在output_indent键直接以indent4输出默认行为等价于四空格缩进但不排序若output_indent为NoneindentNone输出为单行紧凑 JSON若为prettyindent4且sort_keysTrue键按字典序排序若为整数直接作为缩进空格数负数被归一化为None单行。最终统一调用salt.utils.json.dumps(data, defaultrepr, indentindent, sort_keyssort_keys)其中defaultrepr非常关键当返回数据里含有 JSON 无法原生序列化的对象如 Python 的datetime、自定义类时会退而求其次用repr()的字符串形式代替保证整体仍是合法 JSON。5.2 异常兜底except UnicodeDecodeError as exc: log.error(Unable to serialize output to json) return salt.utils.json.dumps({error: Unable to serialize output to json, message: str(exc)}) except TypeError: log.debug(An error occurred while outputting JSON, exc_infoTrue) return salt.utils.json.dumps({})遇到不可解码的字节序列时返回一个带error/message字段的 JSON 错误对象方便调用方程序化感知失败遇到其他序列化TypeError时返回{}保证任何情况下输出的都是合法 JSON不会向管道吐出裸异常堆栈。5.3 底层序列化封装 salt.utils.jsonjson_out使用的 salt/utils/json.py 是对标准库json的封装几个值得注意的点Unicode 兼容dumps/dump默认ensure_asciiFalse中文等非 ASCII 字符原样输出而非转义成\uXXXX便于阅读与传输见 salt/utils/json.py。这解释了单元测试test_unicode_output中Д能原样出现在输出里见 tests/pytests/unit/output/test_json_out.py快速库优先import_json()按ujson → yajl → json的顺序尝试导入优先使用更快的 C 实现见 salt/utils/json.pybytes 兼容loads遇到 Python 3.6 无法直接解析的 bytestring 时自动转成 Unicode 再解析见 salt/utils/json.py。六、输出器调度与回退机制当用户指定--outjson后数据流向为见 salt/output/init.pydisplay_output()先调用try_printout()取格式化结果try_printout()通过salt.loader.outputters(opts)加载所有输出器若指定的输出器不存在则回退到nested再不行回退到raw见 salt/output/init.py若指定了--out-file/--output-file结果写入文件追加模式而非 stdout否则通过print_cli()打印。因此即使json_out模块异常Salt 仍会兜底输出而不是静默丢弃数据。七、测试验证行为即契约json_out的行为被单元测试与集成测试双重锁定可作为你验证本地 Salt 环境输出行为的参照单元测试 tests/pytests/unit/output/test_json_out.py 覆盖无output_indent时默认输出、pretty键排序、整数缩进、0/负数缩进、Unicode 输出集成测试 tests/pytests/integration/cli/test_salt_call.py 用真实 CLI 断言了三种缩进下的精确输出# --out-indent-1 {local: true} # --out-indent0 { local: true } # --out-indent1 { local: true }这些断言与源码中负数 → 单行、整数 → 空格数的规则完全一致是理解行为最可靠的参考。八、实战建议脚本解析首选单行--outjson --out-indent-1保证每个 minion 一条记录逐行json.loads()即可避免依赖解析器的对象边界猜测能力日志/审计用 pretty需要人读时用--output-indentpretty四空格 键排序输出确定性强便于 diff程序化错误感知序列化失败时输出的是带error字段的合法 JSON调用方应显式检查该字段结果落盘配合--out-file将 JSON 结果直接追加写入文件供下游批处理消费。从 CLI 标志到output_indent配置从单行逐条解析到repr兜底与 Unicode 原样输出json_out是理解 Salt 输出器体系模块加载、虚拟名、回退机制的最佳切入口如需查看其他输出器可继续阅读 doc/ref/output/all/index.rst 中的yaml_out、nested等模块文档。赞分享运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载相关推荐RemoveWindowsAI 命令行参数速查3 种组合搞定 90% 的清理场景RemoveWindowsAI 命令行参数速查3 种组合搞定 90% 的清理场景 RemoveWindowsAI 是一个用于移除 Windows 11 中 C运维配置管理后端Salt Master 配置完全指南从 /etc/salt/master 到源码级参数解析Salt Master 配置完全指南从 /etc/salt/master 到源码级参数解析 SaltSaltStack是一个用于大规模基础设施与应用配置管运维配置管理后端Velero CLI 完全解析get restores 命令的参数、输出格式与源码级实现原理Velero CLI 完全解析 get restores 命令的参数、输出格式与源码级实现原理 本文以 Velero前身 Ark早期版本 v0.5.0 的云原生灾备存储后端上一篇把 Webamp 变成 Spotify 皮肤__customMediaClass 自定义媒体播放终极指南下一篇3分钟搞定Axure RP中文界面告别英文烦恼的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

Docker Compose 模块化多环境配置规范指南:示例搭建Directus 12.4.0

Docker Compose 模块化多环境配置规范指南:示例搭建Directus 12.4.0

Docker Compose 模块化多环境配置规范指南:示例搭建Directus 12.4.0Docker Compose 模块化多环境配置规范指南示例:Directus 12.4.0额外说明:Directus 可以干什么?目录结构规范配置文件详解与完整注释1. 全局公共环境配置&#xf…

📅 2026/9/24 16:00:14
建筑 AI 出图工具单轮同场测试:速度、空间保持与局部修改

建筑 AI 出图工具单轮同场测试:速度、空间保持与局部修改

测试日期:2026年9月23日。本文记录一次非盲测、单轮测试,不构成产品排名、购买建议或性能承诺。 建筑概念阶段常见的两个问题是:白模转效果图需要多久,以及局部修改能不能只改指定区域。为了减少不同输入带来的影响,本…

📅 2026/9/24 15:55:13
RK3588实战指南:KVM/QEMU打造ARM虚拟化服务器

RK3588实战指南:KVM/QEMU打造ARM虚拟化服务器

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/24 15:55:13
MORE NEWS

更多资讯

📰

系统指令(System Prompt)设计:让大模型表现稳定的核心方法

经常有朋友问我,为什么同样一个模型,别人调出来的效果那么稳定,自己一上线就各种翻车?答案往往不在模型本身,而在最容易被忽略的“AI 系统指令”上。系统指令(System Prompt)不是你在对话框里随…

📰

2026 AI会议助手横评:功能与协作效率全面对比

1. 为什么2026年选会议助手,重点已经变了这两年AI助手类软件井喷,但大家有没有发现一个有意思的现象:真正用完觉得"离不开了"的,往往不是那些功能参数堆得最满的,而是开会时让你最省心的那几款。我自己从202…

📰

训练MiniGPT实战:从数据加载到文本生成的全流程详解

训练一个微型GPT模型,听起来很唬人,但如果你只是想搞清楚大模型从数据到推理的全链路,MiniGPT是最好的练手项目。我最近把一套完整的训练流程跑通了,从Hugging Face的Dataset加载数据,到Context Window怎么切、AdamW参…

📰

RubricRL实践:用评分规则替代奖励模型的大语言模型强化学习

做了一阵子大语言模型强化学习的实验,我越来越觉得,传统RLHF里那个奖励模型(Reward Model)阶段,又贵又难调。最近反复试下来,RubricRL这个思路是真的能落地——它直接把“评分标准”本身当成奖励信号&#…

📰

提示词瘦身与Skills实战:让GPT-6高效完成复杂任务

1. 为什么OpenAI开始劝你别再把提示词堆成论文1.1 模型能吃下的内容变多了,但“能吃”不等于“会消化”前几年大家写提示词,默认有一个“越长越安心”的心理:只要我把背景、目标、例子、输出格式、注意事项全塞进去,模型总不好意思…

📰

Jmeter接口测试全流程实战:从环境准备到性能压测

我知道很多人对Jmeter的印象还停留在“一个能跑接口请求的绿色小工具”:装好之后,添加线程组、添加HTTP请求、填个URL、点一下运行,看到结果树里是绿色就宣布测试通过。真正进入接口测试这个坑之后你会发现,那一抹绿色其实什么都证…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬