角色(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/ 中的文件,不需要指明文件的路径。