引言
日常运维中,大家是否有遇到需要校验yaml语法是否有问题的场景。
而我就遇到了这个问题,近期在做kubernetes v1.25
实验,在编写yaml
过程中,如果有执行报错的话,给出的信息很少,如下:
排查在格式内容
的调整上很浪费时间,当然主要是不够熟练。所以特意去查找了一些可以帮我对yaml语法校验的方法
,测试出俩个比较好用的工具,分享给大家~
工具简介
1. YAML Validator (YAML Lint):
这是一个简单易用的在线yaml格式验证工具
。只需将yaml语法
粘贴到输入框中,然后单击Validate YAML
按钮即可进行验证。
2. yamllint命令行工具
yamllint
是一个轻量且开源的Python库和命令行工具,它会对指定的yaml文件
进行静态代码分析
和格式检查
,并输出检查结果
。我们就可以根据输出结果来修复yaml语法中存在的问题
如何使用
工具一:YAML Validator
-
接入互联网,在浏览器访问
https://codebeautify.org/yaml-validator
进入如下页面
-
将需要检查的
yaml文件
内容复制粘贴
到文本框,然后单击Validate YAML
按钮进行验证如下示范,根据第一列序号的判断提示进行语句更正即可
但这种工具有局限性,可以检测格式是否存在问题(对齐问题,是否多了空格之类的),但不能对里面的内容进行很好的甄别错误
工具二:yamllint命令行
-
开头先放官方文档
https://yamllint.readthedocs.io/en/stable/quickstart.html
-
先安装工具
# 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
-
我的操作系统是
Ubuntu20.04
root@master1ha1:~# sudo apt-get install yamllint
-
安装完成后,可以直接在命令行输入
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
并不影响使用,自己决定是否要修改~
-
另外还可以通过配置文件
.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免费资料,持续发布中... https://vlink.cc/route
如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!