YAML ↔ JSON

粘贴

预览

Ansible Playbook 缩进一错,为什么日志里只剩一句 YAML 解析错误却找不到行号?

交付自动化时,play、hosts、vars、tasks、handlers、roles 多层嵌套,再夹 Jinja2 条件与循环,复制粘贴最容易把列表项短横线挤出同一列,ansible-playbook 直接报「mapping values are not allowed here」。甲方验收、内部运维接班、外包回传补丁,大家都希望打开文件就能分清「哪块管执行、哪块管变量、哪块管通知」。大家搜「ansible yaml 格式化」「playbook 缩进」「roles 目录 yml 整理」是为了在跑 ansible-lint 与 Molecule 前先用人眼扫清结构,减少「模板渲染后才爆」的无效迭代。vars_files 与 vault 加密串若与 tasks 同级错位,会导致变量悄悄变成空字典,运行时行为与评审材料不一致。含 ansible-vault 的密文不应贴公共网页;请先用占位符或解密后的脱敏副本排版,再在受控环境用 vault encrypt 回写。include_tasks、import_role、block、rescue、always 五类结构里,一旦 rescue 与 tasks 列表缩进错位,失败回滚逻辑会悄悄失效,值班手册却写「已配置自动回滚」——这不是 Ansible 本身玄学,而是 YAML 与人眼对齐的博弈。在 Ansible Tower 或 AWX 里点语法检查前,先用本页把 rescue 与 always 块摊平,能减少日志里只剩 Python traceback、却没人敢改行的黑盒感。把「先排版再 ansible-playbook --syntax-check」写进交付 checklist,夜班交接就少一句「谁改的最后缩进」这种无法取证的对骂,新人第一次合仓库也能在提 MR 前自检。

如何把 Playbook 与 role 片段整理到可跑 ansible-lint 的可读结构

  1. 粘贴前区分「静态 YAML」与「含 Jinja 的模板」:后者应先在被控端或本地用 ansible-playbook --syntax-check 能接受的最小 inventory 渲染,再对渲染结果排版;不要把未渲染模板误当纯 YAML 强转。
  2. 格式化后检查 tasks 列表、handlers 列表与 role: 调用的缩进是否仍在 play 子树内;when、loop、become 等关键字是否挂在 task 项下而非误升到 play 顶层。
  3. 将整理稿合入仓库前,在 CI 跑 ansible-lint 与一次 check 模式;涉及 privilege escalation 的任务在评审表里单独勾选,vault 文件仍只走加密通道与最小权限账号。

Ansible YML 常见问题

Playbook 里 when 条件与 Jinja 过滤器写得很长,格式化会不会把换行合并导致 Ansible 解析表达式出错,长表达式在多行 YAML 里有没有更稳妥的折行与引号写法?
合规格式化应保持标量内容与引号边界;若你发现 Jinja 被截断,多半是原文混用了不安全引号或把表达式拆在多行却未用 YAML 多行语法。应用 ansible-playbook --syntax-check 与 yamllint 规则集交叉验证,并在 MR 里附最小 inventory 复现。
handlers 与 tasks 列表看起来同级,但 notify 名字对不上,这类问题靠 YAML 排版能发现吗,还是应该配合 grep 对照与命名规范表一起排查才靠谱?
排版能让 notify 与 handlers.name 在屏幕上靠近,便于肉眼 diff,但语义仍需按 Ansible 规则核对;建议在命名规范里强制前缀并启用 lint 规则禁止隐式依赖。格式化后做一次 grep 对照 notify 全量列表可显著减少漏注册。
ansible-vault 加密块贴进在线工具会不会自动解密或把密文打散导致无法 play,在公司严禁外发密文时有没有推荐的本地替代流程仍然能整理缩进?
在线工具不应被要求处理 vault 密文;请用 ansible-vault view 在本地解密到临时文件、脱敏后再排版,或只对未加密骨架排版。若密文被改写,vault 头尾标记损坏会导致无法解密,属于严重事故,默认应禁止网页接触。
roles 目录里 tasks/main.yml 与 handlers/main.yml 多文件互相 include,我只排版其中一个会不会让相对路径 include 在运行期找不到,最小复现仓库应该怎样搭才不算浪费时间?
格式化不改变路径字符串内容,但若你同时重排键序或误删空行夹带的注释路径,仍可能引入人为差异;应以 ansible-galaxy init 结构为基准检查 include 相对路径。大改动前后用 molecule converge 做回归,而不是只信浏览器输出。
我想把含生产 inventory 组名与内网 IP 的 play 片段贴进来对齐缩进,安全与合规通常允许到什么程度,公开网页与内网脱敏样例之间的红线到底画在哪?
组名与内网 IP 在许多公司仍属敏感上下文,建议替换为 dev 组与 RFC5737 测试地址再排版;真实 inventory 只留在堡垒机与 Git 受控仓库。若审计要求全程离线,请使用内网打包的格式化器,本页仅适合教学与脱敏样例。
More versions