Ansible 的“清单”文件就像是黄页电话本。有了它,我们就能和各个主机进行通话交流。
分组
像这种通讯联系本都会有一个功能 —— 分组,或者说“打标签”。这样无论再多的联系人(主机)我们都能很轻松地找到。
Ansible 有一个自带的分组名称 —— all。
没错就是字面意思。该分组包含“清单”中的所有联系人。通过这个关键字 all
我们可以同时对“清单”中所有的主机进行操作:
1# /etc/ansible/hosts
2
3host01 ansible_host=x.x.x.x ansible_user=root
4host02 ansible_host=x.x.x.x ansible_user=root
1$ ansible all -m ping
1host01 | SUCCESS => {
2 "changed": false,
3 "ping": "pong"
4}
5host02 | SUCCESS => {
6 "changed": false,
7 "ping": "pong"
8}
接下来,我们自己定义几个分组:
1# /etc/ansible/hosts
2
3[Test]
4test01 ansible_host=x.x.x.x ansible_user=root
5
6[Prod]
7prod02 ansible_host=x.x.x.x ansible_user=root
8prod03 ansible_host=x.x.x.x ansible_user=root
上面,我们先定义了两个分组 Test
,Prod
。接下来我们就可以直接对整个组里的主机进行操作:
1$ ansible Test -m ping
1test01 | SUCCESS => {
2 "changed": false,
3 "ping": "pong"
4}
1$ ansible Prod -m ping
1prod02 | SUCCESS => {
2 "changed": false,
3 "ping": "pong"
4}
5prod03 | SUCCESS => {
6 "changed": false,
7 "ping": "pong"
8}
上面我们创建了两个分组 —— 测试组和生产组。我们现在可以分别操作这两个组,但是有些操作却是不区分测试组还是生产组的,怎么办呢?
没错,再建一个同时包含这两个组所有主机的新分组。
那如果每一个组包含的主机很多,这种做法效率就太低了,我们还有另一种方法 —— 嵌套。
就是我们在新建的组里面直接添上其他的组名,不用一个个添上其他组内的主机名:
1# /etc/ansible/hosts
2
3[Test]
4test01 ansible_host=x.x.x.x ansible_user=root
5
6[Prod]
7prod02 ansible_host=x.x.x.x ansible_user=root
8prod03 ansible_host=x.x.x.x ansible_user=root
9
10[Basic]
11Test
12Prod
这样我们想对所有主机执行一些基础操作的时候,就可以直接操作 Basic
组。
YAML 语法
以上“清单”的配置都是 ini 格式的写法,ansible 的“清单”还支持 YAML 格式的语法。
为什么还要知道 YAML 语法格式的“清单”配置呢?
后面介绍的 Ansible Playbook 配置使用的就是 YAML 语法,虽然“清单”对于 ini 和 YAML 两种语法都支持,但是我们使用同一种语法格式总是会舒服一点。当然这种舒服也是因人而异的,具体使用中哪个适合自己就是用哪个。
下面列出几个 ini 和 YAML 两种格式的对比:
1# 最简单的 ini
2x.x.x.x
3
4# 对应的 YAML
5all:
6 hosts:
7 x.x.x.x
YAML 格式中,最上方的 all
就是之前我们所说的关键字,在 YAML 中必须把 all
写在最上方。这样才符合 all
这个关键字本身的地位嘛。
接着来看其他几个格式对比:
1# 简单分组的 ini 格式
2x.x.x.x
3
4[Ga]
5y.y.y.y
6
7[Gb]
8z.z.z.z
9
10# 对应的 YAML
11all:
12 hosts:
13 x.x.x.x
14 children:
15 Ga:
16 hosts:
17 y.y.y.y
18 Gb:
19 hosts:
20 z.z.z.z
可以看出,YAML 格式中定义“组”需要用到 children
关键字。
再来看个嵌套分组的对比:
1# ini 格式
2[Ga]
3x.x.x.x
4
5[Gb]
6y.y.y.y
7
8[Gc]
9Ga
10Gb
11
12# 对应的 YAML 格式
13all:
14 children:
15 Gc:
16 children:
17 Ga:
18 hosts:
19 x.x.x.x
20 Gb:
21 hosts:
22 y.y.y.y
最后我们再来看一个指定 port、name 的两个格式对比:
1# ini 格式
2x.x.x.x
3host01 ansible_host=y.y.y.y ansible_port=22
4
5# 对应的 YAML 格式
6all:
7 hosts:
8 x.x.x.x
9 host01:
10 ansible_host: y.y.y.y
11 ansible_port: 22
YAML 语法其实也不是很难,只是把一些逻辑上的层级关系用缩进的形式表现了出来,想要查找学习更多关于“清单”的内容,可以参见官网文档。





