角色 role是ansible的一套规范
角色必须包含至少一个这样的目录,但是完全可以排除任何没有使用的目录。在使用时,每个目录必须包含一个main.yml文件,其中包含相关内容:
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,那么相关的证书文件即可放置在此目录中。
当然,上述目录并不全是必须的,也就是说,如果你的角色并没有相关的模板文件,那么角色目录中并不用包含templates目录,同理,其他目录也一样,一般情况下,都至少会有一个tasks目录。
测试:
[root@test1 tasks]# tree /etc/ansible/roles/
/etc/ansible/roles/
└── testrole
├── tasks
│ └── main.yml
└── test.yaml
[root@test1 testrole]# cat main.yml
- debug:
msg: "hello,role"
[root@test1 testrole]# cat test.yaml
---
- hosts: test2
roles:
- testrole
[root@test1 testrole]# ansible-playbook test.yaml
PLAY [test2] ********************************************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************************************
ok: [test2]
TASK [testrole : debug] *********************************************************************************************************************************************************************
ok: [test2] => {
"msg": "hello,role"
}
PLAY RECAP **********************************************************************************************************************************************************************************
test2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
其实,我们也可以为testvar变量设置默认值,这样即使在调用角色时没有传入任何参数,也有默认的值可以使用,同时也不会在调用时因为没有传入对应变量而报错,所以,我们需要在testrole目录中创建一个defaults目录,并且创建defaults/main.yml文件,defaults/main.yml文件内容如下:
# cat testrole/defaults/main.yml
testvar: "role"
默认情况下,我们无法多次调用同一个角色,也就是说,如下playbook只会调用一次testrole角色:
方法一需要为角色设置allow_duplicates属性,而此属性需要设置在meta/main.yml文件中,所以我们需要在testrole中创建meta/main.yml文件,写入如下内容:
# cat testrole/meta/main.yml
allow_duplicates: true
假设现在testrole需要使用一些模板,那么也可以直接将模板文件放到templates目录中。
比如,testrole中需要使用一个名为test.conf.j2的模板文件,那么我们就将test.conf.j2文件放置在testrole/templates/目录中,test.conf.j2文件内容如下
# cat testrole/templates/test.conf.j2
something in template;
{{ template_var }}
模板文件中使用到了 template_var变量,我们可以为 template_var变量定义一个默认变量
# cat testrole/defaults/main.yml
testvar: "test"
template_var: "template"
然后在testrole中,直接使用这个模板文件
# cat testrole/tasks/main.yml
- debug:
msg: "hello {{ testvar }}!"
- template:
src: test.conf.j2
dest: /opt/test.conf