自动化之Ansible-Roles
Playbook—Roles(角色)和Include语句
简介
上篇文章中写到的playbook使用yml文件来写入一大篇的执行任务,但是在日常的主机管理中,希望一些任务是可以被重复调用的,所以需要重新组织这些文件。
基本上使用include
语句引用task文件的方法,可允许你将一个配置策略分解到更小的文件中。使用include
语句引用的tasks是将tasks从其他文件拉取过来。因为handlers
也是tasks,所以你也可以使用include
语句去引用handlers
文件
Playbook同样可以使用include
引用其他yml文件中的task。这时被引用的task会插入当前的yml文件中来执行,当前的yml文件中就有了一个更长的task列表
可以从理解如何使用include
开始,这样会更容易理解roles的概念。
include的使用
假如你希望在多个yml中重复使用同一个task列表,你可以使用include
做到
如:普通的task列表是这样的
# possibly saved as tasks/foo.yml
- name: placeholder foo
command: /bin/foo
- name: placeholder bar
command: /bin/bar
以上这个文件名为foo.yml
,在另一个yml中的task调用此文件,如
tasks:
- include: tasks/foo.yml # 调用文件所在的路径
也可以在yml文件中的handlers
中调用,如要做一个重启apache的handlers
如下:
# handlers/handlers.yml
- name: restart apache
service: name=apache state=restarted
使用include
来调用handlers.yml文件中的东西
- hosts: dbservers
remote_user: root
tasks:
- name:
template: src=template.j2 dest=/etc/foo.conf
notify:
- restart apache
# 这里会自动识别文件的更改,使用notify来调用handlers指定文件中名为restart apache的模块
handlers:
- include: tasks/foo.yml
Roles
已经对tasks和handlers掌握,怎样组织playbook才是最好的方式呢,简单的回答就是roles,Roles基于一个已知的文件结构,自动加载tasks、handlers、vars(变量)等等。基于Roles对内容进行分组
目录结构
/etc/ansible/
├── site.yml
├── dbservers.yml
├── webservers.yml
└── roles
├── common
│ ├── defaults
│ ├── files
│ │ ├── *.conf
│ │ ├── *.sh
│ │ └── *.tar.gz
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── tasks
│ │ ├── *.yml
│ │ └── main.yml
│ ├── templates
│ │ ├── *.j2
│ └── vars
│ └── main.yml
└── nginx
├── defaults
├── files
├── handlers
├── meta
├── tasks
├── templates
└── vars
一个playbook如下:
- hosts: webservers
roles:
- common
- nginx
在目录结构中,nginx
就是roles角色,而common
可以理解为通用的文件,在此处存放
tasks/main.yml
-角色执行的主要任务列表handlers/main.yml
-处理程序,可以在此角色之内或之外使用defaults/main.yml
-角色的默认变量var/main.yml
-角色的其他变量files/main.yml
-角色的部署文件template/main.yml
-角色部署的模板.j2meta/main.yml
-角色的元数据,包括角色依赖性
在这两个角色中分别指定了一些行为:
- 如果roles/nginx/tasks/main.yml存在,其中列出的tasks将被添加play中
- 如果roles/handlers/main.yml存在,其中列出的handlers将被添加到play中
- 如果roles/nginx/var/main.yml存在,其中列出的variables将被添加到play中
- 如果roles/meta/main.yml存在,其中列出的“角色依赖”将被添加到roles列表中
- 所有copy模块可以引用roles/nginx/files/中的文件,不需要指明文件路径
- 所有script模块可以引用roles/nginx/files/中的脚本文件,不需要指明文件路径
- 所有template模块可以引用roles/nginx/templates/中的文件,不需要指明文件路径
- 所有include可以引用roles/nginx/tasks/中的文件,不需要指明文件的路径
如果在一个playbook中同时使用了roles和tasks,roles的优先级最高