ansible学习之role

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]

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: