出处:http://www.zsythink.net/archives/2509

上一篇文章介绍了ansible的基本概念,以及相关的基础配置,我们已经知道,如果想要管理受管主机,则需要将受管主机添加到ansible的管理清单中,当安装ansible以后,会提供一个默认的管理清单,即/etc/ansible/hosts文件,今天我们就来详细的聊聊它。

仍然以我们之前的演示环境为例,我们有4台主机,IP如下

10.1.1.71

10.1.1.70

10.1.1.61

10.1.1.60

主机71为ansible主机,同时,主机71的公钥已经配置在了其他3台主机中。

在前文中,我们已经介绍了怎样简单的配置清单,比如通过IP地址的方式配置受管主机,或者通过别名的方式配置受管主机,此处不再赘述,假设,我想要通过ansible管理主机60与主机61,那么我可以在/etc/ansible/hosts中写入如下内容

10.1.1.60

10.1.1.61

配置完成后,即可通过命令管理这两台主机,仍然使用之前的示例命令作为演示。

如上图所示,我们使用了两条命令,分别去ping主机60和主机61,是没有问题的,其实,我们也可以使用"all"关键字,在一条命令中,一次性的去操作"清单"中的所有主机,示例如下

是不是很简单,有没有很方便?那么,聪明如你一定会想,我们能不能自定义一些类似"all"这样的关键字呢?

答案是肯定的,清单支持"分组"功能,我们可以将某些主机分为一组,然后通过组名去管理组内的所有主机。

比如,主机60和主机61都属于A模块的服务器,主机70属于B模块的服务器,那么,我们则可以在清单中进行如下配置

上述配置表示我们定义了两个组,A组和B组,A组中包含主机60与61,B组中包含主机70,经过上述配置后,我们可以通过组名去管理组内的所有主机,示例如下。

当然,在实际的应用中,我们并不会使用"A"或者"B"这样的名字作为组名,此处是为了演示方便,在实际使用时,组名应该尽量的见名知义

在上例的A组中,两台受管主机的IP地址为10.1.1.60和10.1.1.61 ,细心如你一定发现了,这两台主机的IP地址是连续的,所以,我们可以使用更简洁的方法,配置A组中的受管主机,示例如下

上例A组中的配置与之前A组中的配置的效果是相同的,不过这种方式更加方便,因为如果你需要配置10台IP地址连续的主机时,只需要一条配置就可以搞定了。

除了使用IP地址,我们也可以使用主机名配置受管主机,当然,使用主机名配置受管主机的前提是ansible主机可以正确解析对应的主机名,比如,我们想要通过主机名配置两台主机,示例如下。

眼尖的你一定又从上述配置中发现了某种规律,没错,上述主机名中,"dbSrv-"之后的字母是按照字母顺序排列的,所以,上述配置也可以简写为如下模样,它们的效果是相同的。

通常情况下,我们为了更加的灵活的管理受管主机,可能需要在组内嵌套组。

比如,服务器环境从大类上可以分为"生产环境"和"测试环境",所以,我们很自然的把主机分成了两组,生产组和测试组,但是,仔细想想,生产环境又包含很多业务模块,比如,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文件中编写

上述配置就是使用YAML语法配置的主机清单,非常简单

最上方使用all关键字,all后面有":",你一定联想到了,我们之前可以使用all关键字,管理清单中的所有主机,这里的"all:"就是这个含义。

第二行开头使用一个空格作为缩进,使用hosts关键字,表示hosts属于all的下一级,我们可以这样理解,all是默认的一个组,这个组是最大的一个组,当我们需要在组中定义受管主机时,就需要使用到hosts关键字,当我们进行自定义分组时,也需要使用hosts关键字,每个分组指明自己组内的受管主机时,都要使用到hosts关键字,注意,在YAML的语法中,只能使用空格作为缩进,不能使用tab,否则语法上会报错,如果你习惯使用vim编辑文件,同时你又习惯使用tab作为缩进,那么你可以将ansible主机上的vim进行设置,默认将tab转化为空格,这样就能兼容你的使用习惯了,我就是这样设置的。

第三行开头使用两个空格作为缩进,然后指明了主机60的IP地址,没错,主机60的IP地址就是hosts元素下一级的元素

第四行开头使用两个空格作为缩进,然后指明了主机61的IP地址,你一定想明白了,主机60和主机61的层级是相同的,它们是平级的,因为它们的左侧缩进是对齐的。

为了让从来没有接触过YAML的朋友能够更好的理解,在下面的示例中,我们会先给出INI风格的配置,然后使用YAML语法写出同样效果的配置,并进行对比,以方便理解。

此处先列出上述YAML配置以及对应的INI配置

 
#YAML示例
all:
hosts:
10.1.1.60:
10.1.1.61: #上例相当于如下INI配置
10.1.1.60
10.1.1.61

那么,我们来扩展一下

#先看一个INI风格的配置,示例如下
10.1.1.61 [test1]
10.1.1.60 [test2]
10.1.1.70
#上述配置表示当前清单中有3台受管主机,主机61不属于任何组,主机60属于test1组,主机70属于test2组 #使用YAML语法进行同等效果的配置如下
#注意,为了使缩进显得更加明显,此处每次缩进使用两个空格
all:
hosts:
10.1.1.61:
children:
test1:
hosts:
10.1.1.60:
test2:
hosts:
10.1.1.70:
#从上例可以看出,当直接在清单中创建组时,需要在all关键字内使用children关键字,而定义每个组时,有必须使用hosts关键字,指明组内的主机

有了上面的基础,我们来看一下当组中嵌套组时,使用YAML语法应该怎样描写

#仍然先写出INI风格的示例以作对比,如下
[proA]
10.1.1.60 [proB]
10.1.1.70 [pro:children]
proA
proB #对应YAML格式的配置如下
all:
children:
pro:
children:
proA:
hosts:
10.1.1.60:
proB:
hosts:
10.1.1.70:
#上述配置表示,pro组有两个子组,分别为proA组和proB组,而这两个组分别有自己组内的主机。

细心如你,一定已经发现,当我们使用YAML语法配置清单时,无非是使用hosts、children等关键字与我们的自定义名称进行排列组合罢了。

#前文中,我们还介绍了使用别名的方式配置受管主机,INI格式的示例如下

#同等效果的YAML语法配置如下

注意:上图中标注的"空格"不可省,这是YAML的语法,省略空格后会报错

其实,我们还可以在清单中配置变量,但是,目前我们并没有实际的演示场景,所以此处先行略过。

更多内容可以参考官网手册,直达链接如下

http://docs.ansible.com/ansible/2.4/intro_inventory.html

你可能已经习惯使用INI的语法编辑清单,或者你对YAML并不熟悉,于是你准备放弃学习YAML语法,这样并不可行,因为之后我们会介绍怎样编写ansible的剧本,编写ansible剧本时,只能使用YAML语法,所以,不要放弃YAML,当然,我们也不用过于深究YAML的语法,我们只要记住一些套路(固定格式),就可以编写ansible剧本了,所以不要着急,船到桥头自然直,到时候你自然会掌握这些语法的。

ansible学习(二)- 清单配置详解的更多相关文章

  1. Spring Boot 启动(二) 配置详解

    Spring Boot 启动(二) 配置详解 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring Boot 配置 ...

  2. SpringBoot系列(十二)过滤器配置详解

    SpringBoot(十二)过滤器详解 往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件 ...

  3. ansible笔记(2):清单配置详解

    上一篇文章介绍了ansible的基本概念,以及相关的基础配置,我们已经知道,如果想要管理受管主机,则需要将受管主机添加到ansible的管理清单中,当安装ansible以后,会提供一个默认的管理清单, ...

  4. ansible笔记(2):管理清单配置详解

    前情提要:管理清单(Iventory)配置文件/etc/ansible/hosts.通过修改该配置文件以达到管理受控主机的目的.    在我的实验平台上有3台主机:192.168.232.181(an ...

  5. 【SpringCloud微服务实战学习系列】配置详解

    前言 Spring Boot针对常用的开发场景提供了一系列自动化配置来减少原本复杂而又几乎很少改动的模板化配置内容. 一.配置文件 Spring Boot的默认配置文件位置为src/main.reso ...

  6. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  7. Tomcat学习(二)------Tomcat原理详解及请求过程

    Tomcat: Tomcat是一个JSP/Servlet容器.其作为Servlet容器,有三种工作模式:独立的Servlet容器.进程内的Servlet容器和进程外的Servlet容器. Tomcat ...

  8. Nginx干货(二)配置详解

    此篇就不矫情了.直接上个配置吧.以后若有更新,继续修补 /usr/local/nginx/conf目录下面的nginx.conf文件 以用户nginx的身份来运行 user nginx; 启动进程,通 ...

  9. jsp/servlet学习二之servlet详解

    Servlet API概览 Servlet API有一下四个java包: 1,javax.servlet,其中包含定义servlet和servlet容器之间契约的类和接口. 2,javax.servl ...

随机推荐

  1. 带SD读卡的USB HUB方案芯片MA8621|用于带读卡的USB HUB拓展坞方案芯片MA8621

    MA8621是一款带SD读卡器控制器的USB 2.0高速3端口集线器方案芯片,主要用在USB TYPEC拓展坞或者USB typec扩展底座上面. 1. MA8621功能概述 MA8621是USB 2 ...

  2. Linux时间与日期

    date date:显示当前时间[年月日时分秒] date +%[选项] Y:年 m:月 d:日 H:时 M:分 S:秒 date "+%Y-%m-%d":格式化显示,格式可自定. ...

  3. Java面向对象笔记 • 【第4章 抽象类和接口】

    全部章节   >>>> 本章目录 4.1 抽象类 4.1.1 抽象方法和抽象类 4.1.2 抽象类的作用 4.1.3 实践练习 4.2 final修饰符 4.2.1 final ...

  4. EntityFrameworkCore数据迁移(一)

    .net core出来已经有很长一段时间了,而EentityFrameworkCore(后面简称EFCore)是.net framework的EntityFramework在.net core中的实现 ...

  5. hive 之 将excel数据导入hive中 : excel 转 txt

    一.需求: 1.客户每月上传固定格式的excel文件到指定目录.每月上传的文件名只有结尾月份不同,如: 10月文件名:  zhongdiangedan202010.xlsx  , 11月文件名: zh ...

  6. django 使用createView创建视图是form_valid()没有通过?

    django 使用createView创建视图是form_valid()没有通过的原因: fields中定义的字段要与from表单中的字段相对应 修改后 接着又报错: 查看没有取到id,最后通过req ...

  7. js 关于replace() 的使用心得

    1.前言 我想把一段话 let a = "抱歉,您当前的主治医生有紧急情况不得不下班,您的预约将由<br>医生:里斯<br>为您就诊,<br>诊室位置:门 ...

  8. 包装类integer的常用方法

    三种类型互转 (一): String 转换成 int 类型  调用 八大封装类 parseInt方法 结果可见 输出了223 成功转型 (二): int 转换成 String:  调用String类的 ...

  9. 灵雀云新一期DevOps认证培训圆满结束,下期学员招募同步开启

    近日,灵雀云最新一期EXIN DevOps认证培训在北京圆满结束,来自某知名运营商领域ISV的近40名学员以百分百的通过率为此次培训画上圆满的句号. 灵雀云是国内首家在DevOps培训领域与EXIN合 ...

  10. 兼容h5在ios上登录窗口input失焦后页面不会滚

    $("#logincode").blur(function(){ //滚动到顶部 window.scrollTo(0, 0); })一般多用于密码框失焦后,页面不回滚