1.角色对应的目录结构
demorole角色对应的目录结构如下:
[root@ansible roles]# tree demorole/
demorole/
├── defaults
│ └── main.yaml
├── files
│ └── main.yaml
├── handlers
│ └── main.yaml
├── meta
│ └── main.yaml
├── tasks
│ └── main.yaml
├── templates
│ └── main.yaml
└── vars
└── main.yaml
每个目录的解释
tasks目录:角色需要执行的主任务文件放置在此目录中,默认的主任务文件名为main.yml,当调用角色时,默认会执行main.yml文件中的任务,你也可以将其他需要执行的任务文件通过include的方式包含在tasks/main.yml文件中。
handlers目录:当角色需要调用handlers时,默认会在此目录中的main.yml文件中查找对应的handler
defaults目录:角色会使用到的变量可以写入到此目录中的main.yml文件中,通常,defaults/main.yml文件中的变量都用于设置默认值,以便在你没有设置对应变量值时,变量有默认的值可以使用,定义在defaults/main.yml文件中的变量的优先级是最低的。
vars目录:角色会使用到的变量可以写入到此目录中的main.yml文件中,看到这里你肯定会有疑问,vars/main.yml文件和defaults/main.yml文件的区别在哪里呢?区别就是,defaults/main.yml文件中的变量的优先级是最低的,而vars/main.yml文件中的变量的 优先级非常高 ,如果你只是想提供一个默认的配置,那么你可以把对应的变量定义在defaults/main.yml中,如果你想要确保别人在调用角色时,使用的值就是你指定的值,则可以将变量定义在vars/main.yml中,因为定义在vars/main.yml文件中的变量的优先级非常高,所以其值比较难以覆盖。
meta目录:如果你想要赋予这个角色一些元数据,则可以将元数据写入到meta/main.yml文件中,这些元数据用于描述角色的相关属性,比如 作者信息、角色主要作用等等,你也可以在meta/main.yml文件中定义这个角色依赖于哪些其他角色,或者改变角色的默认调用设定.
templates目录: 角色相关的模板文件可以放置在此目录中,当使用角色相关的模板时,如果没有指定路径,会默认从此目录中查找对应名称的模板文件。
files目录:角色可能会用到的一些其他文件可以放置在此目录中,比如,当你定义nginx角色时,需要配置https,那么相关的证书文件即可放置在此目录中。
2.角色使用的简单演示
[root@ansible roles]# cat demorole/tasks/main.yaml
- debug:
msg: "this is role test"
然后在demorole同级目录编辑调用剧本的角色。
[root@ansible roles]# cat test.yaml
---
- hosts: 192.168.10.20
remote_user: root
roles:
- demorole
验证
[root@ansible roles]# ansible-playbook test.yaml
PLAY [192.168.10.20] *****************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************************************************************************
ok: [192.168.10.20]
TASK [demorole : debug] **************************************************************************************************************************************************************************************
ok: [192.168.10.20] => {
"msg": "this is role test"
}
3.角色执行的路径
可以编辑/etc/ansible/ansible.cfg配置多个路径
roles_path = /etc/ansible/roles:/opt:/testdir
可以使用绝对路径的方式,调用对应的角色
- hosts: 192.168.10.20
roles:
- role: "/testdir/ansible/testrole/"
- hosts: 192.168.10.20
roles:
- role: testrole
执行role的时候可以在下面设置变量
- hosts: 192.168.10.20
roles:
- role: testrole
vars:
testvar: "testtets"
将变量变成角色私有的,则需要设置/etc/ansible/ansible.cfg文件,将private_role_vars的值设置为yes
如果想让下面脚本执行两次,有两种方法
# cat test.yml
- hosts: test70
roles:
- role: testrole
- role: testrole
方法一:
# cat testrole/meta/main.yml
allow_duplicates: true
将allow_duplicates属性设置为true,表示可以重复调用同一个角色。
方法二:
两次调用了testrole角色,两次调用都传入了testvar变量,但是testvar变量的值不同
# cat test.yml
- hosts: test70
roles:
- role: testrole
vars:
testvar: "zsythink"
- role: testrole
vars:
testvar: "zsythink.net"
4.使用role时变量优先级高低
defaults里的变量优先级低于vars里的变量优先级,vars下的优先级高于引用role的时定义的变量。vars变量的优先级低于-e引用的。
5.基于条件判断执行role
- hosts: webservers
roles:
- { role: some_role, when: "ansible_os_family == 'RedHat'" }
6.为role打tags
- hosts: webservers
roles:
- { role: foo, tags: ["bar", "baz"] }
7.在role的前后设置task
- hosts: 192.168.10.20
remote_user: root
pre_tasks:
- shell: echo 'hello'
roles:
- demorole
tasks:
- shell: echo 'thisis task'
post_tasks:
- shell: echo 'hello bye'
结果
[root@ansible roles]# ansible-playbook test.yaml
PLAY [192.168.10.20] *****************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************************************************************************
ok: [192.168.10.20]
TASK *************************************************************************************************************************************************************************************************
changed: [192.168.10.20]
TASK [demorole : debug] **************************************************************************************************************************************************************************************
ok: [192.168.10.20] => {
"msg": "this is role test"
}
TASK *************************************************************************************************************************************************************************************************
changed: [192.168.10.20]
TASK *************************************************************************************************************************************************************************************************
changed: [192.168.10.20]