ansible-playbook-roles-使用

Roles 将功能集以文件夹方式模块化后,使代码更为整洁,更为灵活,复用性也更高,变量的调用方式、Roles 的命名方式等使其在架构
上更为规范化,在复杂度较高的项目中体现得更加明显

roles结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# cat example.yml
---
site.yml
webservers.yml
fooservers.yml
roles/
common/
files/
templates/
tasks/
handlers/
vars/
defaults/
meta/
webservers/
files/
templates/
tasks/
handlers/
vars/
defaults/
meta/

展示了两个功能齐全的Roles,分别为 common 和 webservers, 每个 Roles 均包括 files、templates、tasks、handlers、vars、
defaults、meta。在 Playbooks 中的调用方式如下:

1
2
3
4
5
---
- hosts: webservers
roles:
- common
- webservers

说明

roles/x/tasks/main.yml

主函数,包括其中的所有任务将被执行

roles/x/handlers/main.yml

所有包括其中的handlers将被执行

roles/x/vars/main.yml

所有包括在其中的变量将在roles中生效

roles/x/meta/main.yml

roles 所有依赖将被正常登入

roles/x/{files, templates, tasks}/(dir depends on task)

所有文件、模板都可存放在该这里,放在这里最大的好处是不用指定绝对路径(直接使用文件名,就会找到目录files下的对应文件)。

案例

当 Apache 的配置文件发生变化时重启 Apache 进程。

目录总览

1
2
3
4
5
6
7
8
9
# tree
─ roles
├── apache
│   ├── handlers
│   │   └── main.yml
│   └── tasks
│   ├── main.yml
│   └── restart.yml
└── apache.yml

目录结构需按要求编排,不得随意变更名称。

vim roles/apache/handlers/main.yml

1
2
3
4
5
---
# sleep 10s
#
- name: restart apache
service: name=apache state=restarted

该 YML 要实现的功能非常简单:重启 Apache 进程。

vim roles/apache/tasks/restart.yml

1
2
3
4
5
---
- name: transfer apache config
copy: src=httpd.conf dest=/opt/apache/httpd.conf
notify:
- restart apache

该 YML 功能为更新 Apache 配置文件,如配置文件有变化则重启Apache。

vim roles/apache/tasks/main.yml

1
2
---
- include: restart.yml

vim roles/apache.yml

1
2
3
4
5
---
- hosts: webserver
remote_ user: root
roles:
- role: apache

该 YML 为总调度文件,完成 Apache 配置文件的变更和 Apache 的重启工作。

运行

1
# ansible-playbook apache.yml

命令运行结果为更新 Apache 配置文件,如配置文件有更新则重启 Apache,如无错误返回为正常。

files

Files 和 Templates 均用于 Ansible 文件处理,两者主要区别是:Files(不是 file 模块)目录下的文件无需写绝对路径即可将文件传
输至远程主机; Templates 目录下的文件以 Jinja2 渲染, 且传输文件至远程主机的同时支持预定义变量替换。

案例场景:
将 example role 下的 MAGEDU.PPT 和 STANLEY.PPT 两个文件传输至远程, 并修改文件名为英文小写。

目录

1
2
3
4
5
6
7
8
9
─ roles
├── file.yml
└── example
├── files
│   ├── MAGEDU.PPT
│   └── STANLEY.PPT
└── tasks
├── file.yml
└── main.yml

MAGEDU.PPT、STANLEY.PPT

MAGEDU.PPT 内容如下:
This is magedu. ppt file.

STANLEY.PPT 内容如下:
This is stanley.ppt file.

vim roles/file.yml

1
2
3
4
5
6
7
---
# 该playbook是整个项目的调度入口
- hosts: 192.168.37.142
remote_ user: root
gather_ facts: false
roles:
- role: example

vim roles/example/tasks/file.yml

这里的src后面跟的文件并没有加上绝对路径,就可以直接访问到 roles/example/files/ 目录下的文件

1
2
3
4
5
6
7
---
- name: file change example
# copy: src=MAGEDU.PPT dest=/data/magedu.ppt owner=stanley group=stanley
copy: src={{ item.src }} dest=/data/{{ item.dest }} owner=stanley group=stanley
with_items:
- { src: 'MAGEDU.PPT', dest: 'magedu.ppt' }
- { src: 'STANLEY.PPT', dest: 'stanley.ppt' }

vim roles/example/tasks/main.yml

1
2
---
- include: file.yml

###执行
在 roles 目录同级目录下执行命令:

1
# ansible-playbook file.yml

templates

Templates 常被用作传输文件,同时支持预定义变量替换。因Templates由 Jinja2 渲染格式,所以介绍 Templates 前先来了解Jinja2。
Jinja2 是什么? Jinja2 是一个 Python 的功能齐全的模板引擎。它有完整的 Unicode 支持, 一个可选的集成沙箱执行环境,被广泛使用,以 BSD 许可证授权。

案例场景:

将 order.j2 分发至远程主机/data/{{ PROJECT }}/ 目录下,并改名为 order.conf,
且替换配置文件中变量为对应的值。

目录

1
2
3
4
5
6
7
8
9
10
─ roles
├── templates.yml
└── template
├── tasks
│   ├── main.yml
│   └── template.yml
├── templates
│   └── order.j2
└── vars
└── main.yml

该目录结构下,order.j2 模板文件必须存放于 templates 目录下, main.yml 变量文件存放于 vars 目录下。template.yml 和 main.yml任务执行文件存放于 tasks 目录下。目录结构及命名方式不得随意变更。

vim roles/templates.yml

1
2
3
4
5
6
7
---
# 该 playbook 是 整个 项目 的 调度 入口
- hosts: 192.168.37.142
remote_user: root
gather_facts: false
roles:
- role: template

该 YML 文件是任务总调用文件, 主要指定远程主机、 执行用户、 调用的 roles 等, 相当于”总指挥”的角色。

vim roles/template/tasks/main.yml

1
2
---
- include: template.yml

vim roles/template/tasks/template.yml

src 直接获取roles/template/templates/ 目录下的order.j2文件

1
2
3
---
- name: tempalte transfer example
template: src=order.j2 dest=/data/{{ PROJECT }}/order.conf

{{PROJECT}} 的变量引用方式即前面提到的 Jinja2 格式。 源文件是 order.j2, 远程目录及目的文件
名分别是/data/{{ PROJECT}}/ 和 order.conf。

vim roles/template/templates/order.j2

1
2
3
project: {{ PROJECT }}
switch: {{ SWITCH }}
dbport: {{ DBPORT }}

vim roles/templte/vars/main.yml

1
2
3
4
---
PROJECT: "JAVA"
SWITCH: "ON"
DBPORT: "3306"

执行

1
# ansible-playbook template.yml

然后登录远程主机 192.168.37.142, 检查文件是否正常下发, 以及模板中的变量是否被正常替换。