前面的playbook适应用小型的工程,当我们维护的有多个工程的时候,我们希望工程分开执行,且每个工程都有自己的配置。这种大型工程就要用到Role的功能了。
Role的功能依赖于目录命名规则和目录摆放,其实就是把不同的功能分发到不同目录下的yml文件去。
roles: <--所有的角色必须放在roles目录下,这个目录可以自定义位置,默认的位置在/etc/ansible/roles。这个位置也是可以自己改变的
project: <---具体的角色项目名称,比如nginx、tomcat、php
files: <--用来存放由copy模块或script模块调用的文件。
templates: <--用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。
tasks: <--此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。
main.yml
handlers: <--此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。
main.yml
vars: <--此目录应当包含一个main.yml文件,用于定义此角色用到的变量。
main.yml
defaults: <--此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。
main.yml
meta: <--此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。
main.yml
还是以之前创建文件,修改文件权限的playbook来重新规划roles的文件。文件结构如下。
tasks目录下面三个文件。main.yml, task1.yml, task2.yml..
main.yml中是include task1.yml和task2.yml
- include: task1.yml
- include: task2.yml
task1.yml:
- name: create a go file
command: touch /home/go/{{file_name}}
task2.yml, 其中定义了handler
- name: change the mod
command: chmod 755 /home/go/{{file_name}}
notify: handler rm
上面任务用到的变量file_name,定义在vars/main.yml中
file_name: go_test.go
handlers/main.yml 中定义了具体的handler处理动作
- name: handler rm
command: rm /home/go/{{file_name}}
最后在role_test.yml中定义了具体要执行的role
---
- hosts: webservers
remote_user: wuqi
roles:
- role: role_test
执行ansible-playbook role_test.yml 就可以了。这样就将之前的一个playbook的任务通过role的方式组织起来了
原文:https://www.cnblogs.com/zhanghongfeng/p/13045629.html