1.1 roles与角色扮演
1.1.1 角色简介
角色(roles)是Ansible自1.2版本开始引入的新特性,用于层次性,结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令引入即可。
角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。主要使用场景是代码复用度较高的情况下。
1.1.2 目录结构
一个项目的目录结构一般如图1.7所示。
图1.1 目录结构
其中各目录的功能说明如下。
l files目录
存放由copy或script等模块调用的文件。
l templates目录
templates模块会自动在此目录中寻找Jinja2模板文件。
l tasks目录
任务列表目录,这里应该至少包含一个名为main.yml的文件定义此角色的任务列表。
l handlers目录
定义剧本的处理程序。
l vars目录
变量目录,此处应当包含一个main.yml文件,用于定义此角色用到的变量。
l meta目录
该目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系,注意1.3版本及其以后的版本才支持该项目录。
l default目录
默认变量目录。
下面以远程部署Nginx为例演示其用法。
1.1.1 通过roles远程部署Nginx
1.准备目录结构
首先在Ansible服务器中创建roles目录结构,并创建基础的.yaml文件,便于后续配置使用。具体操作如下所示。
#搭建roles的基础目录结构
[root@ansible ~]# mkdir roles/nginx/{files,handlers,tasks,templates,vars} -p
#创建所需的基本.yaml文件
[root@ansible ~]# touch roles/site.yaml roles/nginx/{handlers,tasks,vars}/main.yaml
创建完成后,将Ngnx配置文件的主页信息修改为“1234”,便于后续观察实验效果。
#[root@ansible ~]# echo 1234 > roles/nginx/files/index.html
修改完成后,安装Nginx,并将其配置文件移至可套用的/templates文件夹下,代码如下所示。
[root@ansible ~]# yum install -y nginx && cp /etc/nginx/nginx.conf roles/nginx/templates/nginx.conf.j2
全部设置完成后,查看当前准备完成的目录结构,代码及结果如下所示。
#此处通过tree查看目录结构,没有该软件的可以先安装。
[root@ansible ~]# yum -y install tree
#查看目录结构
[root@ansible ~]# tree roles/
roles/
├── nginx
│ ├── files
│ │ └── index.html
│ ├── handlers
│ │ └── main.yaml
│ ├── tasks
│ │ └── main.yaml
│ ├── templates
│ │ └── nginx.conf.j2
│ └── vars
│ └── main.yaml
└── site.yaml
6 directories, 6 files
2.编写任务
准备工作完成之后,即可开始编写任务,任务内容及含义如下所示。
[root@ansible ~]# vim roles/nginx/tasks/main.yaml
[root@ansible ~]# cat roles/nginx/tasks/main.yaml
---
- name: install epel-release packge #安装epel源,因为nginx的安装需要该源。
yum: name=epel-release state=latest
- name: install nginx packge #安装Nginx
yum: name=nginx state=latest
- name: copy index.html #将更改后的Nginx主页拷贝至客户机
copy: src=index.html dest=/usr/share/nginx/html/index.html
- name: copy nginx.conf template #拷贝配置文件,并引用处理程序
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
- name: make sure nginx service running #保持Nginx服务开启
service: name=nginx state=started enabled=yes
该.yaml文件中许多内容都是以文件路径代替的。执行时,Ansible将会安装任务中的顺序,从各个文件中读取并拷贝内容。这样做的好处是,当一部分内容需要修改时,只需要修改Ansible服务器中的文件母版,再次执行剧本即可完成所有客户机中的修改任务。注意这里调用的处理程序需要在handlers文件目录下进行定义。