ansible中的roles和include
在初次学完playbook之后,想要完成一整套的自动化部署,肯定要写出一大段复杂的playbook,而且部署不同的服务器也很麻烦,可能面对不同的hosts组需要编写不同的playbook,执行的时候就做不到一键执行。
如何用最好的方式去组织playbook?
roles和include就解决了这样的问题。
roles角色
Roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles
例如:
联机服务3台,我设置为online角色
数据库服务2台,我设置为database角色
每一个角色都有自己的一整套playbook,这样可以区分每一个角色要执行的task,管理属于自己的文件,变量,用户名等都特别清晰方便。
在汇总的playbook中,使用include将所有角色的playbook引入进来,就相当于执行了一整套的playbook.
案例
一个项目的结构如下:
- site.yml
- webservers.yml
- fooservers.yml
- roles/
- common/
- files/
- templates/
- tasks/
- handlers/
- vars/
- defaults/
- meta/
- webservers/
- files/
- templates/
- tasks/
- handlers/
- vars/
- defaults/
- meta/
- common/
一个 playbook 如下:
---
- hosts: webservers
roles:
- common
- webservers
这个 playbook 为一个角色 ‘online’ 指定了如下的行为:
- 如果 roles/online/tasks/main.yml 存在, 其中列出的 tasks 将被添加到 play 中
- 如果 roles/online/handlers/main.yml 存在, 其中列出的 handlers 将被添加到 play 中
- 如果 roles/online/vars/main.yml 存在, 其中列出的 variables 将被添加到 play 中
- 如果 roles/online/meta/main.yml 存在, 其中列出的 “角色依赖” 将被添加到 roles 列表中 (1.3 and later)
- 所有 copy tasks 可以引用 roles/online/files/ 中的文件,不需要指明文件的路径。
- 所有 script tasks 可以引用 roles/online/files/ 中的脚本,不需要指明文件的路径。
- 所有 template tasks 可以引用 roles/online/templates/ 中的文件,不需要指明文件的路径。
- 所有 include tasks 可以引用 roles/online/tasks/ 中的文件,不需要指明文件的路径。
在 site.yml 中,我们包含了一个定义了整个基础设施的 playbook.注意这个 playbook 是非常短的, 因为它仅仅包含了其他 playbooks.记住, playbook 不过就是一系列的 plays:
---
# file: site.yml
- include: webservers.yml
- include: fooservers.yml
在诸如 like webservers.yml 的文件中(同样也在顶层结构),我们仅仅将 Web 服务器组与对应的 role 行为做映射.同样值得注意的是这也非常的短小精悍.例如:
---
# file: webservers.yml
- hosts: webservers
roles:
- common
- webservers
理念是我们能够通过 “运行”(running) site.yml 来选择整个基础设施的配置.或者我们能够通过运行其子集 webservers.yml 来配置. 这与 Ansible 的 “–limit” 类似,而且相对的更为显式:
ansible-playbook site.yml --limit webservers
ansible-playbook webservers.yml
参考文档
ansible roles和include介绍:http://www.ansible.com.cn/docs/playbooks_roles.html
ansible playbook最佳实践:http://www.ansible.com.cn/docs/playbooks_best_practices.html
网友评论