Ansible——39.playbook 角色

在这里插入图片描述
创建的角色的角色名为demorole,demorole目录就代表了这个角色,此目录中包含了defaults 、files 、handlers 、meta 、tasks 、templates 、vars等子目录,而且在defaults 、handlers 、meta 、tasks 、vars等目录中,还都有一个名为"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,那么相关的证书文件即可放置在此目录中。
上述目录并不全是必须的,一般情况下,都至少会有一个tasks目录。

创建一个名为"testrole"的目录,这个目录就代表了"testrole"角色

mkdir testrole
mkdir tasks
touch tasks/main.yml
vim  tasks/main.yml
debug:    
msg: "hello role!"

调用角色,使用test.yml文件来调用testrole角色:

cat test.yml
- hosts: test70
  roles:
  - testrole

调用角色时的将test.yml文件写在了testrole目录的同级目录中,调用testrole角色 时,test.yml会从同级目录中查找与testrole角色同名的目录,还有一些其他的目录,在调用角色时,test.yml也会去查找:
同级目录中的roles目录中。
当前系统用户的家目录中的.ansible/roles目录,即 ~/.ansible/roles目录中。
只要testrole目录处于上述三个目录中的任何一个目录中,都可以使用上述方法正常的调用。
可修改ansible的配置文件,设置自己的角色搜索目录,编辑/etc/ansible/ansible.cfg配置文件,设置roles_path选项,此项默认是注释掉的,将注释符去掉,当想要设置多个路径时,多个路径之间用冒号隔开:
roles_path = /etc/ansible/roles:/opt:/testdir
即使的角色目录不处于上述目录中的任何一个,也可以使用绝对路径的方式,调用对应的角色。

- hosts: test70
  roles:
  - "/testdir/ansible/testrole/"

或者

- hosts: test70
  roles:
  - role: "/testdir/ansible/testrole/"

在roles关键字中使用role关键字指定角色对应的绝对路径,也可以直接调用角色,即使不使用绝对路径,也可以使用同样的语法指定角色名。

- hosts: test70
  roles:
  - role: testrole

在角色中使用变量

vim tasks/main.yml
- debug:
    msg: "hello {{ testvar }} !"

在输出的信息中使用了testvar变量,在调用这个角色时,则需要传入对应的变量,否则就会报错。

- hosts: test70
  roles:
  - role: testrole
    vars:
      testvar: "www.zsythink.net"

可以为testvar变量设置默认值,在testrole目录中创建一个defaults目录,并且创建defaults/main.yml文 件,defaults/main.yml文件内容如下:

cat testrole/defaults/main.yml
testvar: "role"

在默认情况下,角色中的的变量是全局可访问的

在这里插入图片描述
定义了两个示例角色,都使用了名为testvar的变量,都有各自的默认值,在testrole角色中,testvar的默认值为"test",在demorole角色中,testvar的默认值为"demo",在 test.yml文件中,调用了这两个角色,在调用testrole角色时,传入了testvar变量,其值为zsythink,但是在调用 demorole角色时,没有传入testvar变量,按照正常的理解,当执行test.yml文件时,testrole应该使用"zsythink"作 为testvar变量的值,demorole应该使用默认值"demo"作为testvar变量的值。

ansible-playbook test.yml
 
PLAY [test70] *************************************************
 
TASK [Gathering Facts] *****************************************
ok: [test70]
 
TASK [testrole : debug] *****************************************
ok: [test70] => {
    "msg": "hello zsythink!"
}
 
TASK [demorole : debug] **************************************
ok: [test70] => {
    "msg": "hello zsythink!"
}
 
PLAY RECAP *************************************************
test70                     : ok=3    changed=0    unreachable=0    failed=0

无论是testrole还是demorole,都使用了"zsythink"作为了testvar的变 量值,在默认情况下,角色中的变量是全局可访问的,上例中,当将testvar变量的值设置 为"zsythink"时,就表示将testrole和demorole中的testvar变量的值都设置成了"zsythink",所以最终输出信息时,两个角色的testvar变量都使用了相同的值。
如果想要解决上述问题,则可以将变量的访问域变成角色所私有的,如果想要将变量变成角色私有的,则需要设置/etc/ansible /ansible.cfg文件,将private_role_vars的值设置为yes,默认情况下,"private_role_vars = yes"是被注释的,将前面的注释符去除。
默认情况下,无法多次调用同一个角色,playbook只会调用一次testrole角色:

cat test.yml
- hosts: test70
  roles:
  - role: testrole
  - role: testrole

如果想要多次调用同一个角色,有两种方法:
方法一:设置角色的allow_duplicates属性 ,让其支持重复的调用。
方法二:调用角色时,传入的参数值不同。
方法一需要为角色设置allow_duplicates属性,需要在testrole中创建meta/main.yml文件:.

cat testrole/meta/main.yml
allow_duplicates: true

方法二,当调用角色需要传参时,如果参数的值不同,则可以连续调用多次:

cat test.yml
- hosts: test70
  roles:
  - role: testrole
    vars:
      testvar: "zsythink"
  - role: testrole
    vars:
      testvar: "zsythink.net"

变量的优先级,在defaults/main.yml文件和vars/main.yml文件中同时定义 testvar变量,并为其赋值不同的值。

cat testrole/defaults/main.yml
testvar: "test"
# cat testrole/vars/main.yml
testvar: "testvar_in_vars_directory"

在调用testrole时,仍然传入testvar变量,看看testvar变量到底会使用哪个值作为最终的值

 cat test.yml
- hosts: test70
  roles:
  - role: testrole
    vars:
      testvar: "zsythink"

即使在调用角色的时候传入对应的变量,也无法覆盖定义在vars/main.yml文件中的值,利用这个 特性,要确保使用的值定义在vars/main.yml中,以便别人在调用角色时,使用的值就是定义的值,也是有办法灵活的进行覆盖,比如在调用playbook时使用"-e"选项传入参数。

ansible-playbook -e testvar='usethis' test.yml
 
PLAY [test70] *************************************************
 
TASK [Gathering Facts] *****************************************
ok: [test70]
 
TASK [testrole : debug] ****************************************
ok: [test70] => {
    "msg": "hello usethis!"
}
 
PLAY RECAP *************************************************
test70                     : ok=2    changed=0    unreachable=0    failed=0

除了使用"-e"传入的变量的优先级,其他变量(包括主机变量)的优先级均低于vars/main.yml中变量的优先级。
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

在使用template任务时,src直接指定了对应的模板文件的名称,并没有指定任何路径,这代表角色会默认去templates子目录中查找对应的文件。
在角色中使用handlers以便进行触发,则可以直接将对应的handler任务写入到handlers/main.yml文件中,示例如下:

cat testrole/handlers/main.yml
- name: test_handler
  debug:
    msg: "this is a test handler"
cat testrole/tasks/main.yml
- debug:
    msg: "hello testrole!"
  changed_when: true
  notify: test_handler

当需要notify对应handler时,直接写入handler对应的名称即可,角色会自动去handlers/main.yml文件中查找对应的handler。

————Blueicex 2020/3/31 11:41 blueice1980@126.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值