目录
3.1 实例-使用ansible-playbook部署安装htttpd服务,且配置文件修改后会被触发启动。
1、角色roles的概念和作用
角色roles是ansible自1.2版本引入的新特性,用于层次性、结构化的组织playbook,roles能够根据层次型结构自动装载变量文件、tasks任务以及handlers触发等。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷的include他们的一种机制。其实就是将一个大的playbook文件,进行分类拆分,达到根据需要复用的目的。
2、角色roles的目录层级结构
[root@localhost ~]# tree ansible-playbook-roles/ 下面是好几个项目的role,以httpd安装role为例解释
ansible-playbook-roles/ #所有roles的总目录,最外层的,包括playbook的yaml文件
├── host #hosts列表清单目录
│ └── hosts #具体的hosts清单,和/etc/ansible/hosts内容一样,指定部署到哪些机器
├── playbook-all-roles.yml #调用各个roles的总yml文件,可以具体指定调用哪一个role或哪一些role
#指定调用哪些role就是部署相应的role
└── roles #所有roles的总目录,里面是自定义的各个独立的role,部署哪个就配置哪个
├── httpd #以其中一个httpd的role为例,下面是该role下的目录结构,根据需要使用目录
│ ├── default #角色默认的变量,比vars的优先级低
│ ├── files #角色部署时用到的一些文件约定存放目录,可使用copy模块将文件传到远程主机
│ │ └── httpd.conf #准备好的httpd的配置文件
│ ├── handlers #触发到该下面定义的名称时,会触发该下面执行任务处理,修改配置触发重启
│ │ └── main.yml #定义的触发该任务时候,执行的具体任务,如:重启服务
│ ├── meta #角色定义的元数据
│ ├── tasks #角色部署时要执行的任务列表,各个步骤任务的yml文件,main.yml来调整任务顺序
│ │ ├── config_httpd.yml #修改httpd配置任务
│ │ ├── index_httpd.yml #设置httpd访问首页任务
│ │ ├── install_httpd.yml #安装httpd任务
│ │ ├── main.yml #主任务文件,通过该文件可以调整各个任务的执行顺序
│ │ └── service_httpd.yml #启动httpd服务任务
│ ├── templates #使用的模板文件约定目录,可以使用template模块,将模板渲染到远程主机
│ │ └── index.html #事先准备的首页测试文件
│ └── vars #定义变量文件的目录
│ └── main.yml #定义变量的文件,可将变量定义到该文件,供其他文件调用变量
├── mysql5.7
├── nginx
└── tomcat
注意1:
上面目录结构的名字是约定好的,不是随便能改成什么别的名字。所以需要按照上面的目录结构来进行组织palybook文件
注意2:
上面是以httpd角色为例解释的roles相关的目录层级结构,具体哪些role使用哪些目录,根据自己需要使用,如果用不到的目录,也可不创建,并不是每个role都需要有上面固定的目录,如:如果httpd的role使用不到template目录,那么可以不用创建templates目录
注意3:
- files/ 存放由copy或script模块等调用的文件
- templates/ template模块查找所需要模板文件的目录
- tasks/ 定义task、role的基本元素,至少应该包含一个main.yml的文件,其他的文件需要在此文件中通过include进行包含
- handlers/ 至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含
- vars/ 定义变量,至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含
- meta/ 定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其他文件需要在此文件中通过include进行包含
- default/ 设定默认变量时使用此目录中的main.yml文件,比vars的优先级低
3、ansible-play使用角色roles部署服务实例
3.1 实例-使用ansible-playbook部署安装htttpd服务,且配置文件修改后会被触发启动。
[root@localhost ~]# cd ansible-playbook-roles-only-httpd/
[root@localhost ansible-playbook-roles-only-httpd]# ls
host playbook-all-roles.yml roles
[root@localhost ansible-playbook-roles-only-httpd]# cat host/hosts #查看主机列表
[test]
192.168.81.133 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="1"
[root@localhost ansible-playbook-roles-only-httpd]# cat playbook-all-roles.yml #查看选择部署的某个role
#test: 为/etc/ansible/hosts中的主机列表 #task: 执行的任务
#name: 描述信息 #yum: yum模块,安装服务的
#copy: copy模块,远程传递文件的 #file: file模块,远程创建目录的
#service: service模块,远程管理服务的
#remote_user: root 是指定远程主机上使用的用户
#gather_facts: no 是默认执行playbook时候,默认会收集目标主机的信息,禁用掉能提高效率
---
#httpd role
- hosts: test
remote_user: root
gather_facts: no
#下面是调用相应的role,调用哪些role就部署哪些
roles:
- role: httpd
#- role: nginx
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/ #查看里面所有的role,只看httpd,其他role为空
httpd mysql5.7 nginx tomcat
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/httpd/ #查看httpd的role的层级结构
default files handlers meta tasks templates vars
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/httpd/default/ #default目录没用上,为空
为空
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/httpd/files/ #查看准备的自定义httpd的配置文件
httpd.conf
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/files/httpd.conf |grep Listen #修改端口
# Listen: Allows you to bind Apache to specific IP addresses and/or
# Change this to Listen on specific IP addresses as shown below to
#Listen 12.34.56.78:80
Listen 82
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/httpd/handlers/ #查看修改配置后触发的重启任务
main.yml
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/handlers/main.yml
- name: restart #定义被触发的handler名称,当修改配置文件后会根据该名称触发重启服务
service: name=httpd state=restarted
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/httpd/meta/ #meta目录没用上,为空
为空
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/httpd/tasks/ #查看所有任务和任务执行顺序
config_httpd.yml index_httpd.yml install_httpd.yml main.yml service_httpd.yml
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/tasks/main.yml
- include: install_httpd.yml
- include: config_httpd.yml
- include: index_httpd.yml
- include: service_httpd.yml
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/tasks/install_httpd.yml
- name: install httpd
yum: name=httpd state=installed
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/tasks/config_httpd.yml
- name: config http
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart #修改配置时候触发重启的handler名称,重启httpd服务
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/tasks/index_httpd.yml
- name: index.html
template: src=index.html dest=/var/www/html/index.html
#使用template模块将templates目录中文件渲染到远程主机目录
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/tasks/service_httpd.yml
- name: start service
service: name=httpd state=started enabled=yes
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/httpd/templates/ #查看网页模板文件和调用变量情况
index.html
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/templates/index.html #查看调用变量情况
<h1> {{shouye_content}} </h1>
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/httpd/vars/ #查看变量文件
main.yml
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/vars/main.yml #查看定义变量的内容
shouye_content: "httpd test111"
[root@localhost ansible-playbook-roles-only-httpd]# ansible-playbook -i host/hosts playbook-all-roles.yml #执行
所有被管理端:192.168.81.133查看httpd服务部署和配置文件情况程度
[root@localhost ~]# netstat -anput |grep 82
tcp6 0 0 :::82 :::* LISTEN 41228/httpd
[root@localhost ~]# cat /etc/httpd/conf/httpd.conf |grep 82
Listen 82
3.2 遇到的问题记录
排查步骤:
排查82端口是否被进程占用导致绑定82端口的httpd服务不能启动,发现不是因为这个问题导致的。
使用journactl -xe查看系统日志找到不能启动原因
排除是否是因为权限问题:
检查防火墙是否放行82端口的流量
排查是不是selinux导致的,selinux可能会阻止Apache服务访问82端口
使用getenforce命令查看selinux的状态
看到selinux是开着的,排除是不是因为selinux开着的原因阻止了apache服务访问82端口,于是关掉selinux
此时,再次执行剧本,发现成功启动了apache服务!!!
问题总结:就是selinux原因,阻止了Apache服务不能绑定82端口。