role是task文件、变量文件、handlers文件的集合体,这个集合体的显著特点是:可移植性和可重复执行性。
实践中,通常我们以部署某个服务为单元作为一个role ,然后将这些服务单元(role)放在一个roles目录下。主playbook文件通过调用roles目录下的role,来实现各种灵活多变的部署需求。
通常创建一个role的方法有两种:
当然我现在还是用现成的。
例如,我想使用「ansible-galaxy init」命令创建一个名字为role_A 的role,可以这样写:
ansible-galaxy init role_A
➜ tree role_A
role_A
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml directories, files
使用「ansible-galaxy」命令自动创建的role是最全的目录结构,根据需求,可以删除不用的目录文件。
我们以上面创建的「role_A」为例,介绍下各目录文件的作用:
role中各个目录下的main.yaml文件很重要,这是ansible默认加载的YAML文件。
比较常用的方法,我们可以使用「roles:」语句引用role :
---
- hosts: node1
roles:
- role_A
或者
---
- hosts: node1
roles:
- name: role_A
- name: role_A
或者
---
- hosts: node1
roles:
- role: role_A
- role: role_A
或者使用绝对路径:
---
# playbooks/test.yaml
- hosts: node1
roles:
- role: /root/lab-ansible/roles/role_A
引入的同时添加变量参数:
---
# playbooks/test.yaml
- hosts: node1
roles:
- role: role_A
vars:
name: Maurice
age:
引入的同时添加tag参数:
---
# playbooks/test.yaml
- hosts: node1
roles:
- role: role_B
tags:
- tag_one
- tag_two
# 等价于上面
- { role: role_B, tags:['tag_one','tag_two'] }
根据需求,我们在playbook中引用不同的role,引用后的效果也很好理解:ansible会把role所包含的任务、变量、handlers、依赖等加载到playbook中,顺次执行。
上面介绍了使用「roles」语句的引用方法,那么ansible去哪找这些role呢?
在不使用绝对路径的情况下,ansible检索role的默认路径有:
注:上面的检索路径是在centos操作系统下测试出来的结果。