(1)
(1.1)ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、task以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来说,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。
复杂场景:建议使用roles,代码复用度高。变更指定主机或主机组;如命名不规范维护和传承成本大;某些功能需多个playbook,通过include即可实现
官方建议是在/etc/ansible/roles/下创建角色,但是我们是可以在任意的路径下创建的,因此我们选择在/root/ansible/roles目录下创建角色,我们可以创建httpd,mysql,memcache这些目录。
需求:我们创建一个nginx服务,我们需要创建一个nginx的组,还需要创建一个nginx用户,同时还要安装nginx的包,还可以把相关的配置文件拷贝到各服务器中,最后还要把nginx的服务启动起来
# mkdir roles/{httpd,mysql,memcache} -pv
在/root/ansible/roles目录下创建httpd,mysql,memcache这些目录
(1.2)roles目录结构及各目录作用--nginx服务
每个角色,以特定的层级目录结构进行组织,roles目录结构在roles/project/目录下:
1.files/ 目录:存放由copy或scrip模块等调用的文件
2.templates/ 目录:templates模块查找所需要模板文件的目录
3.tasks/ 目录:定义task,role的基本元素,至少应该包含一个名为main.yaml的文件;其他的文件需要在此文件中通过include进行包含
4.handlers/ 目录:至少应该包含一个名为main.yaml的文件;其他的文件需要在此文件中通过include进行包含
5.vars/ 目录(不常用):定义变量,至少应该包含一个名为main.yaml的文件;其他的文件需要在此文件中通过include进行包含
6.meta/ 目录(不常用):定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yaml的文件,其它文件需要在此文件中通过include进行包含
7.default/ 目录(不常用):设定默认变量时使用此目录中的main.yaml文件
需求:我们创建一个nginx的角色,然后使用角色可以直接安装软件
# vim group.yaml
在/root/ansible/roles/nginx/tasks目录下创建一个group.yaml用来创建组的文件
# vim user.yaml
在/root/ansible/roles/nginx/tasks目录下创建一个user.yaml用来创建user的文件
# vim yum.yaml
在/root/ansible/roles/nginx/tasks目录下创建一个yum.yaml用来安装文件
# vim start.yaml
在/root/ansible/roles/nginx/tasks目录下创建一个start.yaml文件,用来启动系统的服务
# vim restart.yaml
在/root/ansible/roles/nginx/tasks目录下创建一个restart.yaml文件,用来重启系统的服务
# cp /etc/nginx/nginx.conf nginx.conf.j2
将/etc/nginx/nginx.conf文件拷贝到/root/ansible/roles/nginx/templates目录下并命名为nginx.conf.j2
# vim nginx.conf.j2
编辑nginx.conf.j2配置文件
# vim templ.yaml
在/root/ansible/roles/nginx/tasks目录下创建一个templ.yaml文件用来指定模板文件复制到的具体地址下面
# vim main.yaml
在/root/ansible/roles/nginx/tasks目录下创建一个main.yaml文件,用来定义task文件谁先执行谁后执行的顺序
# vim nginx_role.yaml
在/root/ansible目录下创建一个nginx_role.yaml文件,这个文件和/root/ansible/roles文件是平级的关系
# ansible-playbook nginx_role.yaml
我们使用playbook执行nginx_role.yaml定义的配置文件,然后即可以给各主机安装nginx服务
# ansible all -m shell -a 'ss -tnl'
查看其它主机的80端口是否有开启
# ansible all -m shell -a 'ps aux | grep nginx'
查看各主机的nginx服务是否有启动
(1.3)roles目录结构及各目录作用--httpd服务
需求:我们需要在各主机上创建apache用户同时将本机的httpd服务下的httpd.conf文件传送到对应主机的配置目录下。
# cp /etc/httpd/conf/httpd.conf /root/ansible/roles/httpd/files/
把本机的httpd服务下的httpd.conf文件拷贝到/root/ansible/roles/httpd/files/目录下
# vim user.yaml
在/root/ansible/roles/httpd/tasks目录下创建user.yaml文件,用来创建用户
# vim copyfile.yaml
在/root/ansible/roles/httpd/tasks目录下创建一个copyfile.yaml文件,用来传输文件
# vim main.yaml
在/root/ansible/roles/httpd/tasks目录下创建一个main.yaml的主的配置文件
# vim httpd_role.yaml
我们在/root/ansible目录下创建一个httpd_role.yaml配置文件,并指定使用创建的角色httpd
# ansible-playbook httpd_role.yaml
在/root/ansible目录下使用playbook执行创建的httpd_role.yaml配置文件
# ansible all -m shell -a 'ls -l /data'
查询/data目录下是否有生成httpd.conf配置文件
# ansible all -m shell -a 'getent passwd apache'
查询是否有生成apache用户
(1.4)roles目录结构及各目录作用--同时安装httpd和nginx服务
# vim some_role.yaml
如果我们想在各主机上安装两个服务,那么我们可以在yaml文件中定义安装两个角色即可
(1.5)roles目录结构及各目录作用--如果我们想在nginx中调用httpd角色中task下的文件
# vim /root/ansible/roles/nginx/tasks/main.yaml
编辑nginx下的main.yaml文件
# vim /root/ansible/roles/httpd/tasks/copyfile.yaml
编辑httpd角色下的copyfile.yaml文件,将需要拷贝的文件修改写上绝对路径
# ansible-playbook nginx_role.yaml
在/root/ansible目录下使用playbook执行创建的nginx_role.yaml配置文件
(2)
(2.1)针对不同的role角色添加标签
# vim some_role.yaml
在/root/ansible目录下对some_role.yaml文件进行配置
# ansible-playbook -t web some_role.yaml
我们使用playbook执行/root/ansible目录下的web some_role.yaml 文件,其中使用的tag标签指明为web
(2.2)针对不同的role角色添加when选择关键字
在/root/ansible目录下对some_role.yaml文件进行配置
# ansible-playbook some_role.yaml
使用playbook执行some_role.yaml文件,当系统的版本是7的时候会执行安装nginx服务的操作
(2.3)使用role搭建一个规模化的批量部署程序
# vim group.yaml
在/root/ansible/roles/app/tasks目录下编辑group.yaml配置文件
# vim user.yaml
在/root/ansible/roles/app/tasks目录下编辑user.yaml配置文件
# vim yum.yaml
在/root/ansible/roles/app/tasks目录下编辑yum.yaml配置文件
# cp /etc/httpd/conf/httpd.conf /root/ansible/roles/app/templates/httpd.conf.j2
将httpd服务下的httpd.conf文件拷贝到/root/ansible/roles/app/templates目录下
# vim httpd.conf.j2
编辑httpd.conf.j2配置文件
# vim main.yaml
在/root/ansible/roles/app/vars目录下创建main.yaml配置文件
# vim templ.yaml
在/root/ansible/roles/app/vars目录下创建templ.yaml配置文件
# vim main.yaml
在/root/ansible/roles/app/handlers目录下创建main.yaml配置文件
# vim start.yaml
在/root/ansible/roles/app/tasks目录下创建start.yaml配置文件
# vim copyfile.yaml
在/root/ansible/roles/app/tasks/copyfile.yaml配置文件中编辑
# vim main.yaml
在/root/ansible/roles/app/tasks/main.yaml配置文件中编辑
# vim app_role.yaml
在/root/ansible目录下的app_role.yaml配置文件中编辑
# ansible-playbook app_role.yaml
使用playbook执行/root/ansible目录下的app_role.yaml文件
# ansible all -m shell -a 'ss -tnlp'
查询各主机上启动的进程号是否是我们自己定义的
# ansible all -m shell -a 'ps aux | grep httpd'
查询各主机上启动的进程是否是app用户
# ansible all -m shell -a 'ls /etc/httpd/conf.d'
查询各主机上/etc/httpd/conf.d目录下是否有生成vhosts.conf文件
(2.4)roles目录结构及各目录作用--memcached缓存批量设置
# yum install memcached -y
在130服务器的本机安装memcached服务
# rpm -ql memcached
在本机查找到/etc/sysconfig/memcached配置文件
# cat /etc/sysconfig/memcached
查看内存当缓存使用,查看缓存占用的空间大小为64M
# ansible all -m setup -a 'filter="ansible_memtotal_mb"'
查询各主机的系统缓存信息
# cp /etc/sysconfig/memcached templates/memcached.j2
把/etc/sysconfig/memcached配置文件拷贝到/root/ansible/roles/memcached/templates目录下并命名为memcached.j2
# vim /root/ansible/roles/memcached/templatesmemcached.j2
编辑创建的模板文件
# vim yum.yaml
在/root/ansible/roles/memcached/tasks目录下编辑yum.yaml配置文件
# vim start.yaml
在/root/ansible/roles/memcached/tasks目录编辑start.yaml配置文件
# vim main.yaml
在/root/ansible/roles/memcached/tasks目录编辑main.yaml配置文件
# vim templ.yaml
在/root/ansible/roles/memcached/tasks目录编辑templ.yaml配置文件
# vim memcached_role.yaml
在/root/ansible目录下创建一个memcached_role.yaml配置文件
# ansible-playbook memcached_role.yaml
使用playbook执行/root/ansible/memcached_role.yaml文件
# ansible all -m shell -a 'ss -tnlp | grep 11211'
查看各主机上的11211的memcached的端口是否有打开
# ansible all -m shell -a 'cat /etc/sysconfig/memcached'
查看各主机上的/etc/sysconfig/memcached文件中的缓存配置是否是内存的四分之一
如果还需要其他更丰富的role,我们也可以参考官方站定:https://galaxy.ansible.com/home ,http://www.ansible.com.cn/index.html 学习更多的知识。
—————— 本文至此结束,感谢阅读 ——————