自动化运维工具——Ansible(四)——YAML语法
到目前为止,我们一直都在使用INI的配置风格去配置“清单”,其实,/etc/ansible/hosts不仅能够识别INI的配置语法,还能够识别“YAML”的配置语法。
1. 什么是YAML
YAML(Yet Another Markup Language)语言(发音 /ˈjæməl/ )是一个类似 XML、JSON 的标记性语言。YAML 强调以数据为中心,并不是以标识语言为重点。因而 YAML 本身的定义比较简单,号称“一种人性化的数据格式语言”。目的就是方便人类读写。它实质上是一种通用的数据串行化格式。
我们可以以使用YAML编写配置文件,而ansible的清单也支持YAML的语法,所以我们可以使用YAML语法编写清单,从而管理受管主机。
2. YAML配置示例一
在server1中:
vim /etc/ansible/hosts
all:
hosts:
172.25.1.2:
172.25.1.3:
上述配置就是使用YAML语法配置的主机清单,非常简单
最上方使用all关键字,all后面有”:”,你一定联想到了,我们之前可以使用all关键字,管理清单中的所有主机,这里的”all:”就是这个含义。
第二行开头使用一个空格作为缩进,使用hosts关键字,表示hosts属于all的下一级,我们可以这样理解,all是默认的一个组,这个组是最大的一个组,当我们需要在组中定义受管主机时,就需要使用到hosts关键字,当我们进行自定义分组时,也需要使用hosts关键字,每个分组指明自己组内的受管主机时,都要使用到hosts关键字。
注意,在YAML的语法中,只能使用空格作为缩进,不能使用tab,否则语法上会报错,如果你习惯使用vim编辑文件,同时你又习惯使用tab作为缩进,那么你可以将ansible主机上的vim进行设置,默认将tab转化为空格,这样就能兼容你的使用习惯了。
第三行开头使用两个空格作为缩进,然后指明了主机2的IP地址,没错,主机2的IP地址就是hosts元素下一级的元素
第四行开头使用两个空格作为缩进,然后指明了主机3的IP地址,你一定想明白了,主机2和主机3的层级是相同的,它们是平级的,因为它们的左侧缩进是对齐的。
测试:
ansible all -m ping
ansible 172.25.1.2 -m ping
ansible 172.25.1.3 -m ping
3. YAML配置示例二
先看一个INI风格的配置
172.25.1.2
[test1]
172.25.1.3
[test2]
172.25.1.4
上述配置表示当前清单中有3台受管主机,主机2不属于任何组,主机3属于test1组,主机4属于test2组
使用YAML语法进行同等效果的配置如下
(注意,为了使缩进显得更加明显,此处每次缩进使用两个空格)
all:
hosts:
172.25.1.2
children:
test1:
hosts:
172.25.1.3
test2:
hosts:
172.25.1.4
从上例可以看出,当直接在清单中创建组时,需要在all关键字内使用children关键字,而定义每个组时,有必须使用hosts关键字,指明组内的主机
测试:
ansible test1 -m ping
ansible test2 -m ping
ansible 172.25.1.2 -m ping
4. YAML配置示例三
有了上面的基础,我们来看一下当组中嵌套组时,使用YAML语法应该怎样描写
仍然先写出INI风格的示例以作对比,如下:
[proA]
172.25.1.2
[proB]
172.25.1.3
[pro:children]
proA
proB
对应YAML格式的配置如下
all:
children:
pro:
children:
proA:
hosts:
172.25.1.2:
proB:
hosts:
172.25.1.3:
上述配置表示,pro组有两个子组,分别为proA组和proB组,而这两个组分别有自己组内的主机。
测试:
ansible pro -m ping
ansible proA -m ping
ansible proB -m ping
细心如你,一定已经发现,当我们使用YAML语法配置清单时,无非是使用hosts、children等关键字与我们的自定义名称进行排列组合罢了。
5. YAML配置示例四
前文中,我们还介绍了使用别名的方式配置受管主机,INI格式的示例如下:
172.25.1.2
server3 ansible_host=172.25.1.3
172.25.1.4
测试:
ansible server3 -m ping
ansible 172.25.1.2 -m ping
ansible 172.25.1.4 -m ping
同等效果的YAML语法配置如下:
all:
hosts:
172.25.1.2:
server3:
ansible_host: 172.25.1.3
172.25.1.4:
注意:上图中标注的”空格”不可省,这是YAML的语法,省略空格后会报
测试:
ansible server3 -m ping
ansible 172.25.1.2 -m ping
ansible 172.25.1.4 -m ping
你可能已经习惯使用INI的语法编辑清单,或者你对YAML并不熟悉,于是你准备放弃学习YAML语法,这样并不可行,因为之后我们会介绍怎样编写ansible的剧本,编写ansible剧本时,只能使用YAML语法,所以,不要放弃YAML,当然,我们也不用过于深究YAML的语法,我们只要记住一些套路(固定格式),就可以编写ansible剧本了,所以不要着急,船到桥头自然直,到时候你自然会掌握这些语法的。