Bootstrap

ansible-playbook角色roles使用实例及遇到的问题排除记录

目录

1、角色roles的概念和作用

2、角色roles的目录层级结构

3、ansible-play使用角色roles部署服务实例

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的优先级低










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端口。

;