以下所有的实验来都是在rhel7.3上
1.ansible roles简介
Ansible roles是为了层次化、结构化地组织Playbook
roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们
roles一般用于基于主机构建服务的场景中,在企业复杂业务场景中应用的频率很高
以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等
相当于函数的调用把各个功能切割成片段来执行
2.roles目录结构
3.ansible-galaxy命令工具
Ansible Galaxy 是一个免费共享和下载 Ansible 角色的网站,可以帮助我们更好的定义和学习roles
ansible-galaxy命令默认与https://galaxy.ansible.com网站API通信,可以查找、下载各种社区开发的 Ansible 角色
ansible-galaxy在 Ansible 1.4.2 就已经被包含了在ansible galaxy网站查询roles
安装的roles默认是存放在家目录中:/root/.ansible/roles
对于的roles的快速部署,很有帮助
出于安全原因,下载的代码需要仔细研读每一行代码
注意:接下来创建的所有角色都是基于上一篇文章的
之前所有的都写在playbook当中,现在实现角色分离,这样更有利于自动化运维
环境部署
主机信息 | 作用 |
---|---|
sevrer5(172.25.8.5) | role角色分离的设置 |
sevrer6(172.25.8.6) | 测试对象 |
sevrer7(172.25.8.7) | 测试对象 |
sevrer8(172.25.8.8)测试对象 |
4.创建第一个roles(apache)
目的:server5给server6和server7安装httpd服务
(1)role存放的路径在配置文件/etc/ansible/ansible.cfg中定义:roles_path = /etc/ansible/roles
这里我们使用的是普通用户devops来做ansible,因此应该是roles_path = /home/devops/ansible/roles
先在ansible目录下创建roles目录
然后编辑ansible.cfg配置文件,在配置文件中声明
(2)列出已安装的角色,注意路径问题
此时还没有创建角色,因此是空的
(3)进入角色目录,创建apache角色,再次查看角色就有了
##初始化apache
[root@server5 ~]# yum install -y tree
[wxh@server5 roles]$ tree .
[wxh@server5 ansible]$ ansible-galaxy list
- apache, (unknown version)
(4)进入apache角色目录,发现有任务目录、触发器目录、模板目录、变量目录等等
删除测试目录和说明文档,这两个暂时没有用
[wxh@server5 ansible]$ cd roles/
[wxh@server5 roles]$ cd apache/
[wxh@server5 apache]$ ls
defaults files handlers meta README.md tasks templates tests vars
[wxh@server5 apache]$ rm -fr README.md #删除暂时不需要的
[wxh@server5 apache]$ rm -fr tests
(5)编写任务的yml文件
[wxh@server5 apache]$ cd templates/
[wxh@server5 apache]$ pwd
/home/wxh/ansible/apache
[wxh@server5 apache]$ cp httpd.conf.j2 ../roles/apache/templates/
[wxh@server5 templates]$ ls
httpd.conf.j2
[wxh@server5 templates]$ cd ..
[wxh@server5 apache]$ cd tasks/
[wxh@server5 tasks]$ cp /home/wxh/ansible/apache/playbook.yml main.yml #复制之前的进行修改
[wxh@server5 tasks]$ vim main.yml
[wxh@server5 tasks]$ cat main.yml---
- name: install apacheyum:name:- httpd- phpstate: present- name: config apachetemplate:src: httpd.conf.j2dest: /etc/httpd/conf/httpd.confnotify: restart apache- name: start apacheservice:name: "{
{ item }}"state: startedenabled: trueloop: #轮询的过程- httpd- firewalld- name: config firewalldfirewalld:service: httppermanent: yesstate: enabled
(6)编写触发器的yml文件
[wxh@server5 tasks]$ cd ..
[wxh@server5 apache]$ cd handlers/
[wxh@server5 handlers]$ vim main.yml #触发器的设定
---
- name: restart apacheservice:name: httpdstate: restarted
(7)编写模板文件,拷贝一个过来即可,不需要修改
(8)编写变量的yml文件
[wxh@server5 apache]$ cd vars/
[wxh@server5 vars]$ vim main.yml
[wxh@server5 vars]$ cat main.yml #变量的设定
---
http_port: 80
(9)#添加httpd页面
[wxh@server5 apache]$ cd files/
[wxh@server5 files]$ vim index.html
[wxh@server5 files]$ cat index.html
<h1>{
{ ansible_facts['hostname'] }}</h1>
[wxh@server5 apache]$ cd tasks/
[wxh@server5 apache]$ pwd
/home/wxh/ansible/roles/apache
[wxh@server5 apache]$ cd tasks/
[wxh@server5 tasks]$ vim main.yml
#添加httpd页面
- name: create index.htmlcopy:src: index.htmldest: /var/www/html/index.html
(10)查看主机文件,确保主机信息正确
(11)编写最终要执行的文件
[wxh@server5 ansible]$ pwd
/home/wxh/ansible
[wxh@server5 ansible]$ vim httpd.yml---
- hosts: webserverroles: #角色- apache- hosts: localhost #验证本地become: falsetasks:- name: verify web server ##验证Web服务器 uri:url: "http://{
{ item }}"return_content: yesstatus_code: 200loop: "{
{ groups['webserver'] }}"
(11)验证并开始执行,没有报错,说明角色分离成功
[wxh@server5 ansible]$ ansible-playbook --syntax-check httpd.yml # 语法检查
[wxh@server5 ansible]$ ansible-playbook --list-tasks httpd.yml #检测任务列表
[wxh@server5 ansible]$ ansible-playbook --list-hosts httpd.yml #检测主机
[wxh@server5 ansible]$ ansible-playbook httpd.yml #执行脚本
!
这就实现了apache的角色分离
其实昨天把所有的都做出来了,也验证了效果,今天就是实现一下角色分离
也就是把昨天的playbook.yml文件拆分
#小知识点
查看ansible所支持的模块ansible-doc -l #列出所有ansible支持的模块,重要,请自行记住
[wxh@server5 tasks]$ ansible-doc service #查看service的服务支持的模块
[wxh@server5 ansible]$ ansible-doc uri #查看uri的服务支持的模块
[wxh@server5 tasks]$ ansible-doc firewalld
5.创建第二个roles(haproxy)
目的:在server1上安装haproxy服务,实现server2和server3的负载均衡
#1 创建haproxy角色,以及删除没有用的文件和目录
#查看server6上是否有haproxy
#查看yum支持的模块
##修改wxh的权限
#小知识点
Linux用户配置sudo权限(visudo)
sudo的工作过程如下:
1,当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限
2,确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认
3,若密码输入成功,则开始执行sudo后续的命令
4,root执行sudo时不需要输入密码(eudoers文件中有配置root ALL=(ALL) ALL这样一条规则)
5,若欲切换的身份与执行者的身份相同,也不需要输入密码
#2 进行ssh 免密服务
#3 编写任务文件
#4安装haproxy
#5编写触发器文件
#6 编写模板文件,复制一下haproxy的配置文件
#7 不需要编写变量文件
#8 编写最终要执行的haproxy文件,因为haproxy和httpd是结合在一起的,要实现负载均衡,这里还有涉及到when判断
#9 编写主机文件
#10 执行
没有报错,说明成功实现了访问server1负载均衡server2和server3
#也可以在浏览器上进行访问,验证负载均衡是否实现
验证成功,说明成功实现了访问server1负载均衡server2和server3
5.创建第三个roles(keepalived)
目的:在server6和server7上安装httpd,在server5和server8上安装haproxy,在server5上安装keepalived,实现高可用
也就是server5和server8两个调度器之间的高可用
##再快照一个虚拟机server8
#添加用户,以及设置用户权限,这里设置的wxh,切换不需要密码
#server5的普通用户向server8发送ssh免密登陆的公钥(锁)
#验证普通用户,是否可以免密远程登陆server8
#1 给server8安装haproxy
#编写主机文件
#编写执行yml文件
#执行haproxy.yml
无报错;
#在浏览器验证haproxy是否实现成功
#关闭server8的httpd和firewalld的服务,安装keepalived的服务,为了server5安装keepalived使用;
#2创建角色,删除文件
#3编写任务文件
#修改haproxy的文件
#无法ping通,关闭防火墙
#4编写触发器文件
#5编写模块,直接复制server8的,只需要修改
#6编写主机文件信息
#7编写最终要执行的文件
#8执行
#将server8的keepalived卸载,查看haproxy是否启动
#9测试:看是否实现高可用
可以看到server1上具有VIP
在浏览器里面访问VIP,实现了负载均衡,此时是server5上的haproxy做负载均衡
#验证关闭server5的keepalived的服务,发现VIP自动漂移到了server8上面
#server5上已经无vip
#server8上显示vip,高可用服务实现成功
此时浏览仍然可以正常访问,因为server8在做haproxy负载均衡
重新开启keepalived服务,发现VIP又漂回server5上,因为server1的优先级别高
浏览器仍然可以正常访问