1.role之组织架构
例子:
site.yml
webservers.yml
fooservers.yml
roles/
common/
tasks/
handlers/
files/
templates/
vars/
defaults/
meta/
webservers/
tasks/
defaults/
meta/
每个文件夹可以理解为role的一个功能模块,如果需要使用某一个功能,就需要每个文件夹下面新建一个叫main.yml的文件,然后main.yml可以写入相关功能。
每个文件夹的解释:
-
tasks
-主要被执行的任务 -
handlers
-基本与notify搭配,我简单理解为触发器触发之后执行的动作 -
defaults
- 默认变量 -
vars
- 其他变量 -
files
- 文件存放路径 -
templates
- 模板 -
meta
- 元数据
当然在上面的文件夹里面也可以有其他文件,官方有个经典案例
# roles/example/tasks/main.yml
- name: added in 2.4, previously you used 'include'
import_tasks: redhat.yml
when: ansible_facts['os_family']|lower == 'redhat'
- import_tasks: debian.yml
when: ansible_facts['os_family']|lower == 'debian'
# roles/example/tasks/redhat.yml
- yum:
name: "httpd"
state: present
# roles/example/tasks/debian.yml
- apt:
name: "apache2"
state: present
也就是在tasks下面可以放多个yml文件,然后有main.yml来导入,这样看上去会有一种分层感。
2.使用Roles
1.经典使用方法
该种方式理解为静态导入
---
- hosts: webservers
roles:
- common #可以指向自定义绝对路径如/path/to/my/roles/common,我不建议这么做!
- webservers
注意:如果存在meta/main.yml 将优先执行里面的内容(在满足过滤条件下)
2.roles内联
---
- hosts: webservers
tasks:
- debug:
msg: "before we run our role"
- import_role:
name: example
- include_role:
name: example
- debug:
msg: "after we ran our role"
include 动态导入
import 静态导入
3.role接受其他关键字
---
- hosts: webservers
roles:
- common
- role: foo_app_instance
vars:
dir: '/opt/a'
app_port: 5000
- role: foo_app_instance
vars:
dir: '/opt/b'
app_port: 5001
#更新的语法
---
- hosts: webservers
tasks:
- include_role:
name: foo_app_instance
vars:
dir: '/opt/a'
app_port: 5000
...
#该案例是符合条件执行role
---
- hosts: webservers
tasks:
- include_role:
name: some_role
when: "ansible_facts['os_family'] == 'RedHat'"
4.role tags
---
- hosts: webservers
roles:
- role: bar
tags: ["foo"]
# using YAML shorthand, this is equivalent to the above
- { role: foo, tags: ["bar", "baz"] }
#更新的语法
---
- hosts: webservers
tasks:
- import_role:
name: foo
tags:
- bar
- baz
3.重复执行role
两种办法
1.通过在role里定义不同的参数
2.Add allow_duplicates: true to the meta/main.yml file for the role.
Example 1 - passing different parameters:
---
- hosts: webservers
roles:
- role: foo
vars:
message: "first"
- { role: foo, vars: { message: "second" } }
In this example, because each role definition has different parameters, foo will run twice.
Example 2 - using allow_duplicates: true:
# playbook.yml
---
- hosts: webservers
roles:
- foo
- foo
# roles/foo/meta/main.yml
---
allow_duplicates: true
4.role的依赖关系
meta/main.yml
通过一个官方案例
role car 依赖role wheel
car的依赖关系文件为:
---
dependencies:
- role: wheel
vars:
n: 1
- role: wheel
vars:
n: 2
- role: wheel
vars:
n: 3
- role: wheel
vars:
n: 4
wheel的依赖关系文件为:
---
dependencies:
- role: tire
- role: brake
role tire和brake的依赖关系文件为:
---
allow_duplicates: true
最后的执行顺序为:
tire(n=1)
brake(n=1)
wheel(n=1)
tire(n=2)
brake(n=2)
wheel(n=2)
...
car
疑问这里为什么wheel可以重复执行呀,因为他有不同的变量,1,2,3,4
网友评论