Bootstrap

推荐:YAML语法校验工具实践

引言

日常运维中,大家是否有遇到需要校验yaml语法是否有问题的场景。

而我就遇到了这个问题,近期在做kubernetes v1.25 实验,在编写yaml过程中,如果有执行报错的话,给出的信息很少,如下:

排查在格式内容的调整上很浪费时间,当然主要是不够熟练。所以特意去查找了一些可以帮我对yaml语法校验的方法,测试出俩个比较好用的工具,分享给大家~

工具简介

1. YAML Validator (YAML Lint):

这是一个简单易用的在线yaml格式验证工具。只需将yaml语法粘贴到输入框中,然后单击Validate YAML按钮即可进行验证。

2. yamllint命令行工具

yamllint是一个轻量且开源的Python库和命令行工具,它会对指定的yaml文件进行静态代码分析格式检查,并输出检查结果。我们就可以根据输出结果来修复yaml语法中存在的问题

如何使用

工具一:YAML Validator

  1. 接入互联网,在浏览器访问 https://codebeautify.org/yaml-validator

    进入如下页面

  1. 将需要检查的yaml文件 内容复制粘贴到文本框,然后单击Validate YAML按钮进行验证

    如下示范,根据第一列序号的判断提示进行语句更正即可

但这种工具有局限性,可以检测格式是否存在问题(对齐问题,是否多了空格之类的),但不能对里面的内容进行很好的甄别错误

工具二:yamllint命令行

  1. 开头先放官方文档 https://yamllint.readthedocs.io/en/stable/quickstart.html

  2. 先安装工具

# On Fedora / CentOS (note: EPEL is required on CentOS):
sudo dnf install yamllint

# On Debian 8+ / Ubuntu 16.04+:
sudo apt-get install yamllint

# On Mac OS 10.11+:
brew install yamllint

# Python (pip)
pip install yamllint
  1. 我的操作系统是Ubuntu20.04

root@master1ha1:~# sudo apt-get install yamllint

  1. 安装完成后,可以直接在命令行输入yamllint test_file.yaml 开始检查,如下示例

如下所示,不使用yaml语法校验工具的话,报错回显信息是很少的,不容易判断

root@master1ha1:~# kubectl apply -f storage-configmap-redis.yaml 
configmap/redis-conf created
error: error parsing storage-configmap-redis.yaml: error converting YAML to JSON: yaml: line 10: did not find expected key
  • 下面使用yamllint校验工具

    输出后的结果后面的注释是自行添加的,本身没有中文提示,但可以复制这些提示去网上搜索,比较方便

root@master1ha1:~# yamllint storage-configmap-redis.yaml 
storage-configmap-redis.yaml
  1:1       warning  missing document start "---"  (document-start) #开头加“---”,不理也行
  16:3      error    wrong indentation: expected 4 but found 2  (indentation) #开始格式不对,一般是有空格或用了tab
  16:22     warning  too few spaces before comment  (comments) #注释位置缺空格,不理也行
  20:2      error    syntax error: expected <block end>, but found '<block mapping start>' (syntax)     #开始格式不对,一般是有空格或用了tab
  24:1      error    trailing spaces  (trailing-spaces)  #尾巴多了空格
  • 左边的不是时间戳,是错误行号和列号。我们可能不知道它说的是什么错误,但现在知道错误的位置了。再看一遍位置,错误本质就显而易见了。根据检查出的这几个警告和错误,可以把其修改成正确的格式...然后再执行检查,没有报错了

root@master1ha1:~# yamllint storage-configmap-redis.yaml 
root@master1ha1:~# 
  • 再次执行kubectl apply -f,成功,没有报错!!!这表示按照yamllint提示做的修改是正确的

root@master1ha1:~# kubectl apply -f storage-configmap-redis.yaml 
configmap/redis-conf created
pod/cm-redis-demo created
root@master1ha1:~# kubectl get cm 
kube-root-ca.crt  redis-conf        
root@master1ha1:~# kubectl get cm redis-conf 
NAME         DATA   AGE
redis-conf   1      31s
root@master1ha1:~# kubectl get pod -A
NAMESPACE      NAME                                 READY   STATUS                  RESTARTS         AGE
default        cm-redis-demo                        0/1     ContainerCreating       0                40s

正常情况下,我们一般关注error即可,warning并不影响使用,自己决定是否要修改~

  1. 另外还可以通过配置文件.yamllint 或 yamllint.conf定制规则,比如限制空格数量、禁止制表符、强制缩进等。

    然后执行yamllint -c yamllint.conf test_file.yaml检查

    参考规则手册 https://yamllint.readthedocs.io/en/stable/rules.html

因为默认的配置对我来讲已经够用,所以没有再做举例。有兴趣的小伙伴可以实验一下~

总结

这俩种工具的使用比较:

1. YAML Validator (YAML Lint):

  • 接入互联网使用,不需要安装

  • 使用简单,复制粘贴需要校验的yaml语句即可

  • 可以检测格式是否存在问题(对齐问题,是否多了空格之类的),但不能对里面的内容进行很好的甄别错误

2. yamllint命令行工具

  • 命令行工具,支持多端操作系统版本,需要独立安装

  • 使用简单,在命令行执行yamllint test_file.yaml即可

  • 除可以检测格式外,能对语句内容(如重复项..)做判断,并且支持自定义.yamllint 或 yamllint.conf这样的校验规则

最后

应用了YAML语法校验工具,它可以帮助我们在编码早期就发现并修复错误,减少和避免因为格式问题导致的应用程序崩溃或部署失败,还可以帮助维护代码风格的一致性。

另外注意,不同工具的精确性和功能有所差异,我们可以根据自己需求选择合适的工具来验证YAML语法


最后~欢迎关注我! @Linux学习的那些事儿

我的个人资源整理,满满都是干货: 可按需访问领取

200T免费资料,持续发布中... icon-default.png?t=N7T8https://vlink.cc/route

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

;