目录
1、角色roles的概念和作用
2、角色roles的目录层级结构
ansible-play%E4%BD%BF%E7%94%A8%E8%A7%92%E8%89%B2roles%E9%83%A8%E7%BD%B2%E6%9C%8D%E5%8A%A1%E5%AE%9E%E4%BE%8B-toc" style="margin-left:80px;">3、ansible-play使用角色roles部署服务实例
ansible-playbook%E9%83%A8%E7%BD%B2%E5%AE%89%E8%A3%85htttpd%E6%9C%8D%E5%8A%A1%EF%BC%8C%E4%B8%94%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E4%BF%AE%E6%94%B9%E5%90%8E%E4%BC%9A%E8%A2%AB%E8%A7%A6%E5%8F%91%E5%90%AF%E5%8A%A8%E3%80%82-toc" style="margin-left:120px;">3.1 实例-使用ansible-playbook部署安装htttpd服务,且配置文件修改后会被触发启动。
3.2 遇到的问题记录
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的优先级低
ansible-play%E4%BD%BF%E7%94%A8%E8%A7%92%E8%89%B2roles%E9%83%A8%E7%BD%B2%E6%9C%8D%E5%8A%A1%E5%AE%9E%E4%BE%8B" style="margin-left:.0001pt;text-align:justify;">3、ansible-play使用角色roles部署服务实例
ansible-playbook%E9%83%A8%E7%BD%B2%E5%AE%89%E8%A3%85htttpd%E6%9C%8D%E5%8A%A1%EF%BC%8C%E4%B8%94%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E4%BF%AE%E6%94%B9%E5%90%8E%E4%BC%9A%E8%A2%AB%E8%A7%A6%E5%8F%91%E5%90%AF%E5%8A%A8%E3%80%82" style="margin-left:.0001pt;text-align:justify;">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: testremote_user: rootgather_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 httpdyum: name=httpd state=installed
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/tasks/config_httpd.yml
- name: config httpcopy: src=httpd.conf dest=/etc/httpd/conf/httpd.confnotify: restart #修改配置时候触发重启的handler名称,重启httpd服务
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/tasks/index_httpd.yml
- name: index.htmltemplate: 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 serviceservice: 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端口。