美文网首页ansible
ansible之role二

ansible之role二

作者: 燃燃的爸爸 | 来源:发表于2019-05-08 11:37 被阅读27次

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

相关文章

网友评论

    本文标题:ansible之role二

    本文链接:https://www.haomeiwen.com/subject/gngpoqtx.html