ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Salt JSON 输出模块(json_out)实战指南:从 CLI 参数到源码级缩进与解析原理

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),仅供参考
返回列表