友善且神奇的YAML
我们最近讲ansible提到了yaml,它是最近几年非常流行的一种,嗯,怎么说呢,本质是一种数据序列化的规范,使用上类似json、xml而又有所区别。
我们今天就来揭开YAML的神秘面纱。揭示其本质,与json、xml的异同,以及简单使用,为进一步编写ansible的playbook做准备。
什么是YAML
YAML在介绍自己之前,先介绍自己不是什么,YAML就是 YAML Ain’t Markup Language (YAML™),它不是标记语言,而是a data serialization language designed to be human-friendly and work well with modern programming languages for common everyday tasks。它是一种数据序列化的语言,易于人读写,能很好的与当下的编程语言的一些任务相互协作。
我们讲几个点
它不是标记语言
标记语言是什么是一种将文本以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码。与文本相关的其他信息(包括文本的结构和表示信息等)与原来的文本结合在一起,但是使用标记进行标识。比如html、xml以及时下流行的markdown,他们用plaintext里的文本对数据结构和文档结构处理,比如html中<h1>
表示一级标题,<img>
表示这是一个图片;markdown中用# 表示一级标题,[]
表示图片等等。简单理解 肤浅理解,用一些规定好的规范将简单的字符富文本化。其中有一些xml等进行了扩展,实现了更高层面的东西。
它是用于数据序列化
这是本质,它是专职于数据序列化的语言,用于程序之间传递数据,将数据通过yaml承载,这点也是为什么人们经常将之与json、xml相提并论的原因。但是多多少少还是有点区别的,产生的原因,侧重的领域,使用的场景其实都是有细微差别的,一会我们简单讲讲。
它易于人的读写
我们见过xml也见过json、以及html,说实话,读写困难,层级有时候不易区分。但是YAML通过缩进和一些规范,使之读写都非常方便。
它可以很好的与当下的编程语言相互协作
官网对常用的语言都做出了对接的方式,作为各类语言内部或者之间一种数据序列化的标准设计,可以非常方便且无二义性的被各类语言识别,让数据的传递无差异,以便非常好的让程序处理我们的日常任务。这也是为什么ansible选择它来作为playbook的承载语言。
也因为以上原因,它被广泛运用在了配置文件、信息交换、对象持久化、数据检查等场景。它的文件后缀一般是.yml
YAML的使用
yaml的使用包括了两部分,一个是yaml数据的定义,一个是它在其他程序里如何被使用。
YAML 的基础语法
大小写敏感
使用缩进表示层级关系
不允许使用tab,只允许空格
缩进的空格数量不重要,只要层级相同的元素左对齐即可
‘#’ 表示注释,类似Python 注释生效到行末
YAML的数据结构
yaml 有三种基础的数据结构,
对象,key、value的键值对,可以称之为mapping、字典、哈希等等,约等于Python的dict,value可以是任何支持的数据结构。key值是字符串,按变量的要求命名,字幕开头不会有错的。
数组:一组按次序排列的值,value同样可以是任何支持的数据结构。类似于序列、列表。
纯量:单个不可再分的值,有点像Python中的基础数据结构,有字符串、布尔值、整数、浮点数、Null、时间、日期,这两个有别其他语言。
纯量中的字符串、数字我们比较熟了,我们分别为大家讲讲。
对象
对象的一组键值对,使用冒号结构表示。前面是key,后面是value。
device_name: fw01
类似Python中的
{‘device_name':’fw01‘}
对象可以是复合的,与数组、对象复合使用,表达复杂的数据。
对象与对象结合
# 对象中有对象
dev_info:
name: dev01
auth_info:
username: admin
password: admin123
注意dev_info没有顶头写,也是可以的,但是不推荐。这里只是演示一下。
以下才是比较正规的写法
# 对象中有对象
dev_info:
name: dev01
auth_info