一、roles介绍
什么情况下用到roles?
假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成php服务器,第三个要配置成MySQL服务器。我们如何来定义playbook?
第一个play用到第一个主机上,用来构建httpd,第二个play用到第二个主机上,用来构建php,第三个play用到第三个主机上,用来构建MySQL。这些个play定义在playbook中比较麻烦,将来也不利于模块化调用,不利于多次调。比如说后来又加进来一个主机,这个第4个主机既是httpd服务器,又是php服务器,我们只能写第4个play,上面写上安装httpd和php。这样playbook中的代码就重复了。
也就是说playbooks的所有的方式有个弊端---无法实现重复使用且代码重复;假设在同时部署httpd,php,mayql时或不同服务器组合不同的应用就需要写多个yaml文件。很难实现灵活的调用。
roles 用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块(modules)及处理器(handlers)放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。roles的作用是减少代码的复写。
二、角色集合
角色集合:roles/
phpserver/
webserver/
mysqlserver/
files/:存储由copy或script等模块调用的文件;src直接指定文件名称,不需要写绝对路径;
tasks/:此目录中至少应该有一个名为main.yaml的文件,用于定义各task;其它的文件需要由main.yaml进行“包含”调用;
handlers/:此目录中至少应该有一个名为main.yaml的文件,用于定义各handler;其它的文件需要由main.yaml进行“包含”调用;
vars/:此目录中至少应该有一个名为main.yaml的文件,用于定义各variable;其它的文件需要由main.yaml进行“包含”调用;
templates/:存储由template模块调用的模板文本;src只写文件名即可,不需要写绝对路径;
meta/:此目录中至少应该有一个名为main.yaml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yaml进行“包含”调用;
default/:此目录中至少应该有一个名为main.yaml的文件,用于设定默认变量;
site.yaml:入站文件(站点文件),用于调用roles中的角色
三、角色定制实例
1、在roles目录下生成对应的目录结构
[root@ren6 ~]# mkdir -pv ansible/roles/{webserver,phpserver,mysqlserver}/{files,tasks,vars,templates,handlers}
[root@ren6 ansible]# tree
2、配置角色(webserver)
(1)配置files文件:将httpd配置文件上传到files目录下(线配置一台主机)
[root@ren6 ~]# cp /etc/httpd/conf/httpd.conf ansible/roles/webserver/files/httpd.conf
(2)编写tasks任务列表
[root@ren6 ~]# vim ansible/roles/webserver/tasks/main.yam
(3)由于上面的tasks中定义了notify,所以要定义handlers
[root@ren6 ~]# vim ansible/roles/webserver/handlers/main.yaml
(4)tasks中定义了变量,需要在vars目录下创建main.yaml文件,并在文件中写入变量,以key: value的形式定义
[root@ren6 ~]# vim ansible/roles/webserver/vars/main.yaml
(5)在roles下编辑站点文件site.yaml
[root@ren6 ~]# vim ansible/roles/site.yaml
(6)语法检测及模拟运行
[root@ren6 ~]# ansible-playbook --syntax-check ansible/roles/site.yaml
[root@ren6 ~]# ansible-playbook -C ansible/roles/site.yaml
(7)使用模板文件templates ,复制httpd的配置文件至templates目录下
[root@ren6 ~]# cp /etc/httpd/conf/httpd.conf ansible/roles/webserver/templates/
(8)编辑templates文件
[root@ren6 ~]# vim ansible/roles/webserver/templates/httpd.conf
(9)修改tasks文件
[root@ren6 ~]# vim ansible/roles/webserver/tasks/main.yaml
(10)修改站点文件
[root@ren6 ~]# vim ansible/roles/site.yaml
(11)修改主机信息管理文件
[root@ren6 ~]# vim /etc/ansible/hosts
(12)语法检测及运行
[root@ren6 ~]# ansible-playbook --syntax-check ansible/roles/site.yaml
[root@ren6 ~]# ansible-playbook ansible/roles/site.yaml