一、Roles概述
(1)Roles简介
- Roles又称为角色,playbook被称为本。Roles角色是自1.2版本之后引入的新特性,用于层次性、结构化的组织剧本
- roles能够根据层次型结构自动装载变量文件、任务集、以及触发的动作等,要使用roles只需要在剧本中使用include命令引入即可
- 简单的来说,roles就是分别将变量、文件、任务、模板以及处理器放置于不同的单独的目录,并且可以便捷的通过include引入
- 角色一般用于基于主机构建的服务的场景中,但是也可以是用于构建守护进程等场景中,主要是使用在代码复用度较高的场景下
(2)Roles目录结构
各目录的作用:
roles: 所有的角色必须放到roles目录下,这个目录可以自定义,默认的位置就在/etc/ansible/roles,并且和剧本是同级目录
project: 具体的角色项目命令,比如nginx、tomcat、php
files: 用来存放配置文件或者源代码包的
tasks: 此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include引入其他的位于此目录的任务文件
vars: 此目录应当包含一个main.yml文件,用于定义此角色用到的变量
meta: 此目录应当包含一个main.yml文件,存放角色的说明信息、说明角色依赖等信息,可以不用写
default: 此目录应当包含一个main.yml文件,用于为当前角色设定默认变量
templates: 用来存放配置文件,跟files目录不同的是,这里的配置文件可以调用变量
handlers: 此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作,可以不用写
二、使用Roles
通过roles安装配置httpd服务,这里的roles角色使用默认路径
(1)创建目录
#有两种方法可以创建,第一种就是使用mkdir命令创建,比较麻烦,还有一种是使用ansible命令自动生成 ******第一种,使用mkdir创建 [root@ansible ~]# cd /etc/ansible/roles/ [root@ansible roles]# mkdir -p httpd/{handlers,tasks,templates,vars} [root@ansible roles]# cd httpd/ [root@ansible httpd]# tree ├── handlers ├── tasks ├── templates └── vars 4 directories, 0 files ******第二种,使用ansible命令自动生成 [root@ansible roles]# ansible-galaxy init httpd #使用ansible自动生成httpd角色 - httpd was created successfully [root@ansible roles]# ll 总用量 0 drwxr-xr-x 10 root root 135 6月 24 17:24 httpd [root@ansible roles]# cd httpd/ [root@ansible httpd]# tree #这样创建的比较方便 . ├── defaults │ └── main.yml ├── files ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── README.md ├── tasks │ └── main.yml ├── templates ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml
(2)变量文件准备,vars/main.yml
[root@ansible httpd]# vim vars/main.yml port: 8080 username: www groupname: www
(3)配置模板文件,准备httpd.conf.j2
[root@ansible httpd]# cp /root/httpd.conf templates/httpd.conf.j2 #复制一份httpd的配置文件,将其改名为jinja2模板文件 [root@ansible httpd]# vim templates/httpd.conf.j2 #修改文件,引入变量 。。。。。。 41 #Listen 12.34.56.78:80 42 Listen {{ port }} 43 。。。。。。 65 # 66 User {{ username }} 67 Group {{ groupname }} 68 。。。。。。 #保存退出
(4)任务剧本编写,创建用户、组、安装软件、配置、启动等
******创建组的任务 [root@ansible httpd]# vim tasks/group.yaml - name: 创建组 group: name=www gid=60 system=yes ******创建用户的任务 [root@ansible httpd]# vim tasks/user.yaml - name: 创建用户 user: name=www uid=60 system=yes shell=/sbin/nologin ******安装软件的任务 [root@ansible httpd]# vim tasks/install.yaml - name: 安装httpd yum: name=httpd state=installed ******配置软件的任务 [root@ansible httpd]# vim tasks/config.yaml - name: 复制模板文件 template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #src指定的文件,会自动到template目录下寻找 notify: - restart httpd #创建触发 ******启动软件的任务 [root@ansible httpd]# vim tasks/start.yaml - name: 启动httpd service: name=httpd state=started enabled=yes [root@ansible httpd]# tree tasks #查看创建的文件 tasks ├── config.yaml ├── group.yaml ├── install.yaml ├── main.yml ├── start.yaml └── user.yaml 0 directories, 6 files ******编写main.yml,将上面写的任务全部引入到main.yml文件中 [root@ansible httpd]# vim tasks/main.yml - include: group.yaml - include: user.yaml - include: install.yaml - include: config.yaml - include: start.yaml
(5)编写重启httpd的动作
#因为刚才在编写配置文件的剧本时添加了触发,所以需要写触发相应的动作,没有触发就无需写动作 [root@ansible httpd]# vim handlers/main.yml - name: restart httpd service: name=httpd state=restarted
(6)编写主的httpd的角色文件,调用httpd角色
[root@ansible httpd]# cd .. [root@ansible roles]# vim httpd_roles.yml #其实就是创建剧本 --- - hosts: web02 remote_user: root roles: - role: httpd
(7)查看整体的目录结构
[root@ansible roles]# tree . ├── httpd │ ├── defaults │ │ └── main.yml │ ├── files │ ├── handlers │ │ └── main.yml │ ├── meta │ │ └── main.yml │ ├── README.md │ ├── tasks │ │ ├── config.yaml │ │ ├── group.yaml │ │ ├── install.yaml │ │ ├── main.yml │ │ ├── start.yaml │ │ └── user.yaml │ ├── templates │ │ └── httpd.conf.j2 │ ├── tests │ │ ├── inventory │ │ └── test.yml │ └── vars │ └── main.yml └── httpd_roles.yml 9 directories, 15 files
(8)监测剧本是否有问题
[root@ansible roles]# ansible-playbook -C httpd_roles.yml [WARNING]: Found variable using reserved name: port PLAY [web02] **************************************************************************************************************************** TASK [Gathering Facts] ****************************************************************************************************************** ok: [192.168.100.204] TASK [httpd : 创建组] ********************************************************************************************************************** changed: [192.168.100.204] TASK [httpd : 创建用户] ********************************************************************************************************************* changed: [192.168.100.204] TASK [httpd : 安装httpd] ****************************************************************************************************************** changed: [192.168.100.204] TASK [httpd : 复制模板文件] ******************************************************************************************************************* changed: [192.168.100.204] TASK [httpd : 启动httpd] ****************************************************************************************************************** changed: [192.168.100.204] RUNNING HANDLER [httpd : restart httpd] ************************************************************************************************* changed: [192.168.100.204] PLAY RECAP ****************************************************************************************************************************** 192.168.100.204 : ok=7 changed=6 unreachable=0 failed=0
(9)执行剧本
[root@ansible roles]# ansible-playbook httpd_roles.yml #执行成功 [WARNING]: Found variable using reserved name: port PLAY [web02] **************************************************************************************************************************** TASK [Gathering Facts] ****************************************************************************************************************** ok: [192.168.100.204] TASK [httpd : 创建组] ********************************************************************************************************************** changed: [192.168.100.204] TASK [httpd : 创建用户] ********************************************************************************************************************* changed: [192.168.100.204] TASK [httpd : 安装httpd] ****************************************************************************************************************** changed: [192.168.100.204] TASK [httpd : 复制模板文件] ******************************************************************************************************************* changed: [192.168.100.204] TASK [httpd : 启动httpd] ****************************************************************************************************************** changed: [192.168.100.204] RUNNING HANDLER [httpd : restart httpd] ************************************************************************************************* changed: [192.168.100.204] PLAY RECAP ****************************************************************************************************************************** 192.168.100.204 : ok=7 changed=6 unreachable=0 failed=0
(10)验证
[root@ansible roles]# ansible web02 -m shell -a 'echo "aaaaaa" > /var/www/html/index.html' #编写网页 192.168.100.204 | SUCCESS | rc=0 >> [root@ansible roles]# curl 192.168.100.204:8080 #说明剧本执行成功 aaaaaa
三、Roles总结
编写任务的时候,里面不需要写执行任务的主机,只需要写- name写命令就行,每个任务都是分开编写的文件,最后可以调用main.yml文件去顺序调用想要执行的文件,非常灵活、方便
定义变量的时候直接按照key和value的格式将变量写道vars目录下的main.yml文件即可,然后任务或者模板直接调用,会自动去vars下的main.yml文件寻找
定义动作的时候,直接在动作中的main.yml文件中写触发相应的动作即可,一个文件中可以写多个动作,也可以想任务那样每个动作写一个文件,通过include引入就行,在任务调用触发的时候直接写于动作名字对应即可
模板文件默认放在template目录中,任务调用时会自动到这个目录中寻找模板文件,但是如果是一个角色调用另外一个角色的单个任务时,那么任务中有些调用的模板或者文件就需要写绝对路径