codecamp

Ansible 什么是Roles

在上一章「Ansible 维护大型的 Playbooks?」冻仁提到 Roles 很重要、很好用!这章冻仁就来介绍可让我们加速升空的火箭 (Rocket) 1 吧!

automate_with_ansible_roles_and_windows-01.jpg

《Ansible: Up and Running》 一书的第 8 章标题为「Roles: Scaling Up Your Playbooks」,开门见山的说明了我们可以使用 Roles 来扩充 Playbooks。 2

automate_with_ansible_roles_and_windows-02.jpg

Safari Books Online - https://goo.gl/dxoGSb

如果要用一句话来解释 Roles,那冻仁会这么说:

「Roles 可以降低 Playbooks 的复杂性,更可以增加 Playbooks 的可用性。」

automate_with_ansible_roles_and_windows-03.jpg

Roles 就字面上来说有角色、作用的意思,但它的全名其实是 Playbooks Roles,我们可把它当成是 Playbooks 的延伸使用。

在前一章里,我们虽已把重复的 Tasks 独立出来,但光只有这样是无法分享给其它专案 (Project) 3 使用的。在 Python 的世界里,我们会把写好的程式封装套件 (Packages) 并分享给他人使用,而在 Ansible 的世界里,我们会用 Roles 来形容这个伟大的行为

automate_with_ansible_roles_and_windows-04.jpg

早在「Ansible 如何操作」一章讲解 Playbooks 时,就已出现过 Roles 的踪影了。

「宝宝身上有 Roles 只是宝宝不说。」

automate_with_ansible_roles_and_windows-05.jpg

图片来源:http://goo.gl/GKJvXn

比对一下 Roles 和 Playbooks 的目录结构,可以看到前者多了 roles/ 目录和 chusiang.win_vim 的 role。

automate_with_ansible_roles_and_windows-06.jpg

Role 的基本结构

接下来冻仁将借由这个简单的 example_role 来介绍 Role 的档案架构。

$ tree .
.
└── example_role
    ├── README.md     # 说明文件
    ├── defaults
    │   └── main.yml  # 可被覆写的变数。
    ├── files         # 需复制到 Managed node 的档案。
    ├── handlers
    │   └── main.yml  # 主要的 handler。
    ├── meta
    │   └── main.yml
    ├── tasks
    │   └── main.yml  # 主要的 task。
    ├── templates     # 集中存放 Jinja2 模板的目录。
    ├── tests
    │   ├── inventory
    │   └── test.yml
    └── vars
        └── main.yml  # 不该被覆写的变数。

9 directories, 8 files

关于 Roles 的基本介绍就到这里,下一章冻仁将介绍怎么使用 Roles?

到目前为止,不知大家是否跟上冻仁的脚步了呢?如果有问题,可以在下方留言,冻仁会抽空回答的。

相关连结

1. 当您驾御 Roles 后,就会有如搭上 Rocket 般的一飞冲天! 
2. 《Ansible: Up and Running》的章节、目录资讯可于 Safari Books online (https://www.safaribooksonline.com/library/view/ansible-up-and/9781491915318/) 取得。 ↩
3. 这里指的专案是指一个拥有很多 Playbook 的 Playbooks,可以把它想成是 Chef 的 Cookbooks 或者是 Java 的 Project。 ↩


Ansible 维护大型的 Playbooks
Ansible 怎么使用 Roles
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }