参考:http://www.zsythink.net/archives/2509
上一篇文章介绍了ansible的基本概念,以及相关的基础配置,我们已经知道,如果想要管理受管主机,则需要将受管主机添加到ansible的管理清单中,当安装ansible以后,会提供一个默认的管理清单,即/etc/ansible/hosts文件,今天我们就来详细的聊聊它。
配置完成后,即可通过命令管理这两台主机,仍然使用之前的示例命令作为演示。
如上图所示,我们使用了两条命令,分别去ping主机70和主机71,是没有问题的,其实,我们也可以使用"all"关键字,在一条命令中,一次性的去操作"清单"中的所有主机,示例如下
是不是很简单,有没有很方便?那么,聪明如你一定会想,我们能不能自定义一些类似"all"这样的关键字呢?
答案是肯定的,清单支持"分组"功能,我们可以将某些主机分为一组,然后通过组名去管理组内的所有主机。
比如,主机70和主机71都属于A模块的服务器,主机180属于B模块的服务器,那么,我们则可以在清单中进行如下配置
[A] 192.168.1.71 192.168.1.70 [B] 192.168.1.180
上述配置表示我们定义了两个组,A组和B组,A组中包含主机70与71,B组中包含主机180,经过上述配置后,我们可以通过组名去管理组内的所有主机,示例如下。
当然,在实际的应用中,我们并不会使用"A"或者"B"这样的名字作为组名,此处是为了演示方便,在实际使用时,组名应该尽量的见名知义
如果配置的IP地址是连续的也可以像以下这样配置
192.168.1.[70:71]
除了使用IP地址,我们也可以使用主机名配置受管主机,当然,使用主机名配置受管主机的前提是ansible主机可以正确解析对应的主机名
通常情况下,我们为了更加的灵活的管理受管主机,可能需要在组内嵌套组。
比如,服务器环境从大类上可以分为"生产环境"和"测试环境",所以,我们很自然的把主机分成了两组,生产组和测试组,但是,仔细想想,生产环境又包含很多业务模块,比如,A模块生产组、B模块生产组,同理,测试环境中也会有同样的问题,比如A模块测试环境组,B模块测试组,这时,我们就需要更加细化的进行分组,示例如下
上述示例表示我们配置了3个组,proA组、proB组、pro组,而pro组中包含"子组",没错,"children"关键字表示当前组中存在子组,pro组的子组就是proA组和proB组,也就是说,当我们操作pro组时,就相当于操作proA组和ProB组中的所有主机,这样分组就能为我们带来一些好处,比如,当我们需要针对生产环境中的所有主机进行操作时,调用pro组即可,当我们需要对生产环境中的某一个模块进行操作时,比如生产环境中的A模块,那么我们只调用proA组即可。
当然,你也可以使用更加"原始"的方法,实现与上述分组相同的效果,示例如下。
没错,同一主机可以被分配到不同的组中,而这种分组的方式与之前子组的分组方式实现的效果是相同的,但是,这样分组并不能体现出组与组之间的逻辑层级关系,而且,当子组内的主机非常多时,这种原始的方法容易让管理变得"混乱",所以,当组与组之间存在一定的层级关系时,我们还是推荐使用嵌套组的方式配置组,因为这样做逻辑上更加清晰。
到目前为止,我们一直都在使用INI的配置风格去配置"清单",其实,/etc/ansible/hosts不仅能够识别INI的配置语法,还能够识别"YAML"的配置语法。
YAML是一种语言,YAML是"YAML Ain't a Markup Language"的缩写,从YAML的全称可以看出来,YAML并不是一种标记语言,但是,如果你使用过类似XML这种标记语言,那么你可能会很快的学会YAML,与XML相同的是,我们可以使用YAML编写配置文件,而ansible的清单也支持YAML的语法,所以我们可以使用YAML语法编写清单,从而管理受管主机,这样说可能不是特别容易理解,不如先来看一个小例子(没有接触过YAML语法没有关系,先向下看)
如下示例仍然是在/etc/ansible/hosts文件中编写
all: hosts: 192.168.1.70: 192.168.1.71:
注意:最后都有一个:号
上述配置就是使用YAML语法配置的主机清单,非常简单
最上方使用all关键字,all后面有":",你一定联想到了,我们之前可以使用all关键字,管理清单中的所有主机,这里的"all:"就是这个含义。
第二行开头使用一个空格作为缩进,使用hosts关键字,表示hosts属于all的下一级,我们可以这样理解,all是默认的一个组,这个组是最大的一个组,当我们需要在组中定义受管主机时,就需要使用到hosts关键字,当我们进行自定义分组时,也需要使用hosts关键字,每个分组指明自己组内的受管主机时,都要使用到hosts关键字,注意,在YAML的语法中,只能使用空格作为缩进,不能使用tab,否则语法上会报错,如果你习惯使用vim编辑文件,同时你又习惯使用tab作为缩进,那么你可以将ansible主机上的vim进行设置,默认将tab转化为空格,这样就能兼容你的使用习惯了,我就是这样设置的。
第三行开头使用两个空格作为缩进,然后指明了主机70的IP地址,没错,主机60的IP地址就是hosts元素下一级的元素
第四行开头使用两个空格作为缩进,然后指明了主机71的IP地址,你一定想明白了,主机70和主机71的层级是相同的,它们是平级的,因为它们的左侧缩进是对齐的。
为了让从来没有接触过YAML的朋友能够更好的理解,在下面的示例中,我们会先给出INI风格的配置,然后使用YAML语法写出同样效果的配置,并进行对比,以方便理解。
此处先列出上述YAML配置以及对应的INI配置
#YAML示例 all: hosts: 192.168.1.70: 192.168.1.71: #上例相当于 192.168.1.70 192.168.1.71
那么,我们来扩展一下