Docs/Ansible/角色(Role).md
2022-10-18 16:59:37 +08:00

2.6 KiB
Raw Blame History

角色role用于层次化结构化组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单的说roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地include他们的一种机制。角色一般用于基于主机构建服务的场景中、但也可以是用于构建守护进程等场景中。 目录结构如下:

site.yml
webservers.yml
fooservers.yml
roles/
   common/
     files/
     templates/
     tasks/
     handlers/
     vars/
     defaults/
     meta/
   webservers/
     files/
     templates/
     tasks/
     handlers/
     vars/
     defaults/
     meta/
yml文件用于定义此角色用到的各handler在handler中使用include包含的其他的handler文件也应该位于此目录中
files目录存放由copy或script等模块调用的文件
templates目录templates模块会自动在此目录中寻找Jinja2模板文件
tasks目录至少应该包含一个名为main.yml的文件其定义了此角色的任务列表此文件可以使用include包含其他的位于此目录中的task文件
handlers目录此目录中应当包含一个main
vars目录应当包含一个main.yml文件用于定义此角色用到的变量
meta目录应当包含一个main.yml文件用于定义此角色的特殊设定及其依赖关系ansible 1.3及其以后的版本才支持
default目录为当前角色设定默认变量时使用此目录应当包含一个main.yml文件

那么一个playbook就可以这样写

---
 - hosts: webservers
  roles:
     - common
     - webservers

这个 playbook 为一个角色 x 指定了如下的行为:

如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 将被添加到 play 中
如果roles/x/handlers/main.yml 存在, 其中列出的 handlers 将被添加到 play 中
如果roles/x/vars/main.yml 存在, 其中列出的 variables 将被添加到 play 中
如果roles/x/meta/main.yml 存在, 其中列出的 “角色依赖” 将被添加到 roles 列表中 (1.3 andlater)
所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路径。
所有 scripttasks 可以引用 roles/x/files/ 中的脚本,不需要指明文件的路径。
所有 template tasks 可以引用roles/x/templates/ 中的文件,不需要指明文件的路径。
所有 include tasks 可以引用roles/x/tasks/ 中的文件,不需要指明文件的路径。