暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Ansible 系列(二)

圆不遛球 2018-10-13
150

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 语法其实也不是很难,只是把一些逻辑上的层级关系用缩进的形式表现了出来,想要查找学习更多关于“清单”的内容,可以参见官网文档。



文章转载自圆不遛球,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论