searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Ansible复用:roles

2024-07-31 09:49:43
2
0

介绍

roles可以根据一个固定的目录结构加载相关的vars,files, tasks, handlers等,可以复用和分享

目录结构

roles
  <role_name>/               # 目录,代表一个角色
    tasks/
       main.yml              # 用于定义各种tasks, 一定要有main.yml, 在这个目录下可以创建其他任务文件,在main.yml中引入这些文件
    handlers/
       main.yml              # handlers文件
    templates/   
       <template_name>.j2    # 模板文件, 通过template模块渲染
    files/
       <script>.sh           # 脚本或者文件等,通过script和copy模块使用
       <config>.yml
    vars/
       main.yml              # 和role相关的变量
    default/
       main.yml              # 默认值,优先级比vars低
    meta/
       main.yml              # 定义依赖等
    library/my_module.py     # roles可以包含自定义的modules
    module_utils/            # roles可以包含自定义的module_utils
    lookup_plugins/          # 其他插件
<playbook_name>.yml          # 通过roles属性指定使用的roles

如何查找roles

默认情况下,ansible会从以下位置查找roles

  • 在collection中
  • 在playbook文件相同目录下的roles目录中
  • ~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles​设置的roles_path
  • playbook文件所在目录

也可以直接通过绝对路径指定

---
- hosts: localhost
  roles:
    - role: '/path/to/role'

使用roles

  • 通常用法,在play中通过roles选项指定
  • 在任务中,可以通过include_role​/import_role​指定
  • 作为依赖,在meta/main.yml​中通过dependencies​指定

play级别使用roles

---
- hosts: localhost
  roles:
	- role1
    - roles: role2
      vars:
        var1: value1
      tags: tag1
  • Ansible会静态引用roles,在解析阶段处理这些roles,按一下顺序执行

    • play中定义的pre_tasks

    • pre_tasks​触发的handlers

    • 按列表顺序依次执行roles指定的role

      • meta/main.yml​中定义的依赖先运行
    • play中定义的tasks

    • roles或tasks触发的handlers

    • play中定义的post_tasks

    • post_tasks​触发的handlers

  • role上指定tag,该tag会被应用到role中所有tasks上

任务级别使用roles

  • 动态复用:include_role

    ---
    - hosts: localhost
      tasks:
        - name: task1
          include_role:
            name: role_name
    
        - name: task2
          include_role:
            name: role_name
          vars:
            var1: var_value
          tags: tagA
          when: condition
    
  • 静态复用:import_role

    ---
    - hosts: localhost
      tasks:
        - name: task1
          import_role:
            name: role_name
    
        - name: task2
          import_role:
            name: role_name
          vars:
            var1: var_value
          tags: tagA
          when: condition
    
  • 区别

    • include_role下使用tag,是针对include本身,而import_role下使用tag,是针对引入的角色中所有的任务

role参数验证

  • 从2.11开始
  • meta/argument_specs.yml​定义规格
# meta/argument_specs.yml
---
argument_specs:
  # tasks/main.yml entry point
  main:  # 对应main名称
    short_description: 简单描述
    description:
      - 多行描述
      - 多行描述
    author:
      - 作者
    options:               # 选项,也成为参数或者变量
      变量名:
        type: "int | str | list | dict"           # 变量类型, 当为list时,需要指定elements
        version_added: 指定加入的版本
        required: false | true # 是否必需
        default: 默认值
        choices: 
          - 选项   
        description:
          - 变量描述
        options:           # 再定义dict中的变量

      var_str:
        type: "str"
        required: true
        description: "The string value"

      var_list:
        type: "list"
        elements: "str"
        required: true
        description: "A list of string values."

      var_list_with_dicts:
        type: "list"
        elements: "dict"
        required: false
        default:
          - kind: "kind1"
            required: true
            time: 60
          - kind: "kind2"
            time: 5
        description: "A list of dicts with a defined structure and with default a value."
        options:
          kind:
            type: "str"
            choices:
              - "a"
              - "b"
            required: false
            description: "A string value with a limited list of allowed choices."

          required:
            type: "bool"
            required: false
            default: false
            description: "Whether the kind of food requires boiling before consumption."

          time:
            type: int
            required: true
            description: "Time to prepare."

  # tasks/alternate.yml entry point
  alternate:   # 对应任务文件除去后缀的名称
    short_description: 简单描述
    description:
      - 详细描述
    options:
      var1:
        type: "int"
        required: false
        default: 1024
        description: "The integer value, defaulting to 1024."

在一个play多次运行一个role

---
- hosts: localhost
  roles:
	- role1
    - role2
    - role1    # role1只会执行一次

通过以下方式可以执行多次

  • 传不同的参数

    ---
    - hosts: localhost
      roles:
    	- role: role1
          message: first
        - role: role1  
          message: second
    
  • meta/main.yml​中设置allow_duplicates: true

role依赖

meta/main.yml​中定义,依赖会被先执行

---
dependencies:
  - role: role1
    vars:
      var1: value1
  - role: role2
    vars:
      var2: value2
0条评论
0 / 1000
张****博
6文章数
0粉丝数
张****博
6 文章 | 0 粉丝
原创

Ansible复用:roles

2024-07-31 09:49:43
2
0

介绍

roles可以根据一个固定的目录结构加载相关的vars,files, tasks, handlers等,可以复用和分享

目录结构

roles
  <role_name>/               # 目录,代表一个角色
    tasks/
       main.yml              # 用于定义各种tasks, 一定要有main.yml, 在这个目录下可以创建其他任务文件,在main.yml中引入这些文件
    handlers/
       main.yml              # handlers文件
    templates/   
       <template_name>.j2    # 模板文件, 通过template模块渲染
    files/
       <script>.sh           # 脚本或者文件等,通过script和copy模块使用
       <config>.yml
    vars/
       main.yml              # 和role相关的变量
    default/
       main.yml              # 默认值,优先级比vars低
    meta/
       main.yml              # 定义依赖等
    library/my_module.py     # roles可以包含自定义的modules
    module_utils/            # roles可以包含自定义的module_utils
    lookup_plugins/          # 其他插件
<playbook_name>.yml          # 通过roles属性指定使用的roles

如何查找roles

默认情况下,ansible会从以下位置查找roles

  • 在collection中
  • 在playbook文件相同目录下的roles目录中
  • ~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles​设置的roles_path
  • playbook文件所在目录

也可以直接通过绝对路径指定

---
- hosts: localhost
  roles:
    - role: '/path/to/role'

使用roles

  • 通常用法,在play中通过roles选项指定
  • 在任务中,可以通过include_role​/import_role​指定
  • 作为依赖,在meta/main.yml​中通过dependencies​指定

play级别使用roles

---
- hosts: localhost
  roles:
	- role1
    - roles: role2
      vars:
        var1: value1
      tags: tag1
  • Ansible会静态引用roles,在解析阶段处理这些roles,按一下顺序执行

    • play中定义的pre_tasks

    • pre_tasks​触发的handlers

    • 按列表顺序依次执行roles指定的role

      • meta/main.yml​中定义的依赖先运行
    • play中定义的tasks

    • roles或tasks触发的handlers

    • play中定义的post_tasks

    • post_tasks​触发的handlers

  • role上指定tag,该tag会被应用到role中所有tasks上

任务级别使用roles

  • 动态复用:include_role

    ---
    - hosts: localhost
      tasks:
        - name: task1
          include_role:
            name: role_name
    
        - name: task2
          include_role:
            name: role_name
          vars:
            var1: var_value
          tags: tagA
          when: condition
    
  • 静态复用:import_role

    ---
    - hosts: localhost
      tasks:
        - name: task1
          import_role:
            name: role_name
    
        - name: task2
          import_role:
            name: role_name
          vars:
            var1: var_value
          tags: tagA
          when: condition
    
  • 区别

    • include_role下使用tag,是针对include本身,而import_role下使用tag,是针对引入的角色中所有的任务

role参数验证

  • 从2.11开始
  • meta/argument_specs.yml​定义规格
# meta/argument_specs.yml
---
argument_specs:
  # tasks/main.yml entry point
  main:  # 对应main名称
    short_description: 简单描述
    description:
      - 多行描述
      - 多行描述
    author:
      - 作者
    options:               # 选项,也成为参数或者变量
      变量名:
        type: "int | str | list | dict"           # 变量类型, 当为list时,需要指定elements
        version_added: 指定加入的版本
        required: false | true # 是否必需
        default: 默认值
        choices: 
          - 选项   
        description:
          - 变量描述
        options:           # 再定义dict中的变量

      var_str:
        type: "str"
        required: true
        description: "The string value"

      var_list:
        type: "list"
        elements: "str"
        required: true
        description: "A list of string values."

      var_list_with_dicts:
        type: "list"
        elements: "dict"
        required: false
        default:
          - kind: "kind1"
            required: true
            time: 60
          - kind: "kind2"
            time: 5
        description: "A list of dicts with a defined structure and with default a value."
        options:
          kind:
            type: "str"
            choices:
              - "a"
              - "b"
            required: false
            description: "A string value with a limited list of allowed choices."

          required:
            type: "bool"
            required: false
            default: false
            description: "Whether the kind of food requires boiling before consumption."

          time:
            type: int
            required: true
            description: "Time to prepare."

  # tasks/alternate.yml entry point
  alternate:   # 对应任务文件除去后缀的名称
    short_description: 简单描述
    description:
      - 详细描述
    options:
      var1:
        type: "int"
        required: false
        default: 1024
        description: "The integer value, defaulting to 1024."

在一个play多次运行一个role

---
- hosts: localhost
  roles:
	- role1
    - role2
    - role1    # role1只会执行一次

通过以下方式可以执行多次

  • 传不同的参数

    ---
    - hosts: localhost
      roles:
    	- role: role1
          message: first
        - role: role1  
          message: second
    
  • meta/main.yml​中设置allow_duplicates: true

role依赖

meta/main.yml​中定义,依赖会被先执行

---
dependencies:
  - role: role1
    vars:
      var1: value1
  - role: role2
    vars:
      var2: value2
文章来自个人专栏
自动化运维Ansible
1 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0