我们都喜欢Ansible,但Ansible是YAML。 配置文件有多种格式:值列表,参数值对,INI文件,YAML,JSON,XML以及许多其他格式。 但是,由于所有这些原因,YAML通常被认为特别困难。 尤其是,尽管YAML语法具有令人耳目一新的极简主义,并且具有处理层次结构值的出色功能,但其类似Python的缩进方法却令人讨厌。

如果YAML激怒了您,您可以-并且必须! -请按照以下10个步骤将刺激减少到可接受的水平,并喜欢YAML。 就像应该在清单上一样,我们的十个技巧将从头开始编号,我们会随意添加冥想和精神实践;-)
0.使您的编辑器正常工作
拥有哪种文本编辑器都没有关系-对他而言,可以肯定的是,至少有一个用于使用YAML的插件。 如果您没有,请立即查找并安装。 每次您必须编辑YAML时,花费在搜索和设置上的时间都会得到很多回报。
例如,默认情况下
Atom编辑器支持YAML,但是GNU Emacs将必须安装其他软件包,例如
yaml-mode 。
Ymac模式下的Emacs并显示空格。如果您喜欢的编辑器没有YAML模式,则可以通过使用设置来解决某些问题。 例如,用于GNOME的标准Gedit文本编辑器没有YAML模式,但默认情况下突出显示YAML语法,并允许您配置缩进:
Gedit缩进设置。Gedit的drawspaces插件将空间显示为点,从而消除了缩进级别的歧义。
换句话说,花时间研究您喜欢的编辑器。 找出他或他的开发社区为使用YAML提供的服务,并使用这些功能。 您绝对不会后悔。
1.使用短绒(棉绒)
理想情况下,编程和标记语言使用可预测的语法。 计算机在可预测性方面做得很好,因此早在1978年,就
出现了
皮棉的概念。 如果它已经存在40年了,而您仍然不使用YAML衬纸,那么该尝试yamllint了。
您可以使用标准Linux软件包管理器安装
yamllint 。 例如,在
Red Hat Enterprise Linux 8或
Fedora上,可以这样完成:
$ sudo dnf install yamllint
然后,您只需运行yamllint,并将其传递给YAML文件进行验证。 如果将错误文件传递给linter,则如下所示:
$ yamllint errorprone.yaml errorprone.yaml 23:10 error syntax error: mapping values are not allowed here 23:11 error trailing spaces (trailing-spaces)
左侧的数字不是时间,而是错误的坐标:行号和列号。 错误描述可能不会告诉您任何信息,但您确切知道它在哪里。 只要看一下代码中的这个位置,很可能一切都会变得清晰起来。
当yamllint在文件中找不到错误时,将不显示任何内容。 如果您担心这种沉默并且需要更多反馈,则可以通过双“&”号(&&)使用条件回显命令启动lint,如下所示:
$ yamllint perfect.yaml && echo "OK" OK
在POSIX中,当且仅当前一个命令返回0时,才会触发双“与”号。yamllint仅返回找到的错误数,因此整个条件构造都起作用。
2.用Python而不是YAML编写
如果YAML确实让您生气,请不要在字面上写上。 碰巧YAML是应用程序可识别的唯一格式。 但是在这种情况下,没有必要创建YAML文件。 写上你喜欢的东西,然后转换。 例如,对于Python,有一个很棒的
pyyaml库和两种完整的转换方法:自我转换和基于脚本的转换。
自我转换
在这种情况下,数据文件也是生成YAML的Python脚本。 此方法最适合于小型数据集。 您只需将JSON数据写入Python变量,为它添加import指令前缀,然后在文件末尾添加三行即可实现输出。
#!/usr/bin/python3 import yaml d={ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } } f=open('output.yaml','w') f.write(yaml.dump(d)) f.close
现在,在Python中运行此文件,输出文件为output.yaml:
$ python3 ./example.json $ cat output.yaml glossary: GlossDiv: GlossList: GlossEntry: Abbrev: ISO 8879:1986 Acronym: SGML GlossDef: GlossSeeAlso: [GML, XML] para: A meta-markup language, used to create markup languages such as DocBook. GlossSee: markup GlossTerm: Standard Generalized Markup Language ID: SGML SortAs: SGML title: S title: example glossary
这绝对是正确的YAML,但是yamllint会警告您它不是以---开头。 好吧,这可以轻松地手动修复或稍微修改Python脚本。
通过脚本转换
在这种情况下,我们首先用JSON编写,然后以单独的Python脚本的形式运行转换器,从而在输出中产生YAML。 与前一种方法相比,此方法可扩展性更好,因为转换是通过数据分开的。
首先,创建JSON文件example.json,例如,您可以在
json.org上使用它:
{ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } }
然后创建一个简单的脚本转换器,并将其保存为json2yaml.py。 该脚本导入了YAML和JSON Python这两个模块,还下载了用户指定的JSON文件,执行转换并将数据写入output.yaml文件。
#!/usr/bin/python3 import yaml import sys import json OUT=open('output.yaml','w') IN=open(sys.argv[1], 'r') JSON = json.load(IN) IN.close() yaml.dump(JSON, OUT) OUT.close()
将此脚本保存在系统路径中并根据需要运行:
$ ~/bin/json2yaml.py example.json
3.经常分析
有时候,从另一个角度看问题很有用。 如果您难以想象YAML中数据之间的关系,则可以暂时将它们转换为更熟悉的内容。
例如,如果您习惯使用字典列表或JSON,则可以在Python交互式Shell中仅使用两个命令就可以将YAML转换为JSON。 假设您有一个YAML文件mydata.yaml,那么它的外观如下:
$ python3 >>> f=open('mydata.yaml','r') >>> yaml.load(f) {'document': 34843, 'date': datetime.date(2019, 5, 23), 'bill-to': {'given': 'Seth', 'family': 'Kenlon', 'address': {'street': '51b Mornington Road\n', 'city': 'Brooklyn', 'state': 'Wellington', 'postal': 6021, 'country': 'NZ'}}, 'words': 938, 'comments': 'Good article. Could be better.'}
关于此主题,可以找到很多其他示例。 此外,还有许多在线转换器和本地解析器。 因此,当您在其中只看到难以理解的哈希值时,请不要重新格式化数据。
4.阅读规格
休息片刻后返回YAML,这对转到
yaml.org并重新阅读规格很有用。 如果您在使用YAML时遇到困难,但是还没有达到要求,那么该是纠正这种情况的时候了。 规范非常容易编写,
第6章中的大量示例说明了语法要求。
5.伪配置
在写书或文章时,首先概述初步计划总是很有用的,至少以目录的形式。 YAML也是如此。 您很可能会想象需要将哪些数据写入YAML文件,但是您实际上并不了解如何将它们相互关联。 因此,在雕刻YAML之前,请绘制一个伪配置。
Pseudo-config与伪代码类似,在这里您不必担心结构或缩进,父子关系,继承和嵌套。 就是这样:您绘制数据迭代,因为它们在您脑海中浮现。
伪配置列出了程序员(Martin和Tabitha)及其技能(编程语言:Python,Perl,Pascal和Lisp,Fortran和Erlang)。在纸上绘制伪配置后,请仔细分析它,如果一切正常,请将其格式化为有效的YAML文件。
6.选项卡或两难困境
您必须解决
“制表符或空格?”的难题
。 。 这不是全球性的,而是仅在您的组织或至少一个项目级别上。 无论是否使用sed脚本进行后处理,在程序员的计算机上设置文本编辑器,或在有被解雇威胁的情况下严格遵守短绒棉纸说明的一般收据,都无所谓,但是与YAML相关的所有团队成员必须仅使用空格(根据YAML规范的要求)。
在任何普通的文本编辑器中,您都可以将“自动更正”标签设置为指定的空格数,因此不必担心“
标签”骚乱。
众所周知,每个讨厌YAML的人都不会在屏幕上看到制表符和空格之间的差异。 当不可见的东西被排序,检查并消除了所有其他可能的问题后,通常会在最后记住该东西。 仅仅需要花费一个小时的时间来搜索制表曲线或空格块,它简单地表明您迫切需要创建一个使用另一个策略的策略,然后对它的合规性进行强化的具体验证(例如,通过Git钩子强制穿过棉短绒)。
7.越少越好(或者越少越好)
有些人喜欢用YAML写作,因为它强调结构。 同时,他们积极使用缩进突出显示数据块。 这是一种模拟使用显式定界符的标记语言的骗局。
这是
Ansible文档中这种结构化的
示例 :
# Employee records - martin: name: Martin D'vloper job: Developer skills: - python - perl - pascal - tabitha: name: Tabitha Bitumen job: Developer skills: - lisp - fortran - erlang
对于某些人来说,此选项有助于分解头部中的YAML结构;相反,他们认为,这种方式使其他人产生了很多不良缩进。
但是,如果您是YAML文档的所有者并负责其维护,那么
您(只有您)必须确定如何使用缩进。 如果您因缩进而烦恼,请根据YAML规范将其尽量减少。 例如,可以重写Ansible文档中的上述文件,而不会造成任何损失,如下所示:
--- - martin: name: Martin D'vloper job: Developer skills: - python - perl - pascal - tabitha: name: Tabitha Bitumen job: Developer skills: - lisp - fortran - erlang
8.使用空格
如果您在填写YAML文件时不断重复相同的错误,则可以在其中插入空白模板作为注释。 然后,下次可以简单地复制该工件并在其中输入真实数据,例如:
--- # - <common name>: # name: Given Surname # job: JOB # skills: # - LANG - martin: name: Martin D'vloper job: Developer skills: - python - perl - pascal - tabitha: name: Tabitha Bitumen job: Developer skills: - lisp - fortran - erlang
9.使用其他东西
如果应用程序没有使您陷入困境,那么也许值得将YAML更改为另一种格式。 随着时间的流逝,配置文件可能会超出其自身,因此最好将它们转换为Lua或Python中的简单脚本。
YAML的极简主义和简单性是很多人喜欢的一件好事,但这远不是您军械库中唯一的工具。 因此有时您可以拒绝它。 YAML很容易找到解析库,因此,如果您提供方便的迁移选项,则用户可以相对轻松地度过此故障。
如果您离不开YAML,那么请充分利用这10条提示,并一劳永逸地战胜您对YAML的厌恶!