前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >辨析 role、import_role、include_role

辨析 role、import_role、include_role

作者头像
看、未来
发布2022-05-06 15:17:14
4760
发布2022-05-06 15:17:14
举报
文章被收录于专栏:CSDN搜“看,未来”

文章目录

role

目录结构

一个role可以包含以下八个目录

代码语言:javascript
复制
common/
    tasks/        #  任务文件
    handlers/    # handler文件
    library/
    files/        # 一般不变的文件,比如tar包
    templates/        # 模板文件,需要替换变量,.j2文件
    vars/        # 变量文件
    defaults/    # 默认变量文件
    meta/        # role的依赖关系

Tags的影响

当在play中直接使用role时,role的tag会传给它包含的每一个task,比如:

代码语言:javascript
复制
---
- hosts: ["all"]
  gather_facts: no
  roles:
  - role: kubelet
    tags: ["t1"]

那么t1会传给roles/kubelet/tasks/main.yml中的每一个task。比如main.yml文件内容如下:

代码语言:javascript
复制
---
- name: 安装kubelet
  debug:
    msg: "install kubelet"
  tags: ["t2"]

- name: 安装docker
  debug:
    msg: "install docker"
  tags: ["t3"]

我们执行时添加--tags t1--tags t2,t3,两个task都会被执行

代码语言:javascript
复制
$ ansible-playbook --tags t1 playbook.yml 

PLAY [all] ************************************************************************************************************************************************************************************

TASK [安装kubelet] ******************************************************************************************************************************************************************************
ok: [192.168.2.103] => {
    "msg": "install kubelet"
}

TASK [kubelet : 安装docker] *********************************************************************************************************************************************************************
ok: [192.168.2.103] => {
    "msg": "install docker"
}

PLAY RECAP ************************************************************************************************************************************************************************************
192.168.2.103              : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

执行role中指定的task文件

Role不能像import_roleinclude_role那样通过tasks_from来指定执行哪一个task文件

import_role

使用方法

前面我们可以在playbook当中通过role来引用role,我们还可以通过import_role来引用role,如下:

代码语言:javascript
复制
---
- hosts: ["master"]
  tasks:
  - import_role:
      name: kubelet
  - import_role:
      name: kubectl 

- hosts: ["node"]
  tasks:
  - import_role:
      name: kubelet

静态引用

include_role相比,import_role是一种静态引用。所谓静态引用,就是在预编译阶段,就知道整个playbook要执行哪些任务,具体的表现如下:

  • 1、引用的role的不允许使用变量(varsvars-file除外)
  • 2、import_role本身不会被当作是一个task

比如如下,在import_role的task的名字为task1

代码语言:javascript
复制
---
- hosts: ["all"]
  gather_facts: no
  tasks:
  - name: task1
    import_role:
      name: kubelet

我们在执行发现,task的名字中并不会有这个task:

代码语言:javascript
复制
$ ansible-playbook playbook.yml 

PLAY [all] ************************************************************************************************************************************************************************************

TASK [安装kubelet] ******************************************************************************************************************************************************************************
ok: [192.168.2.103] => {
    "msg": "install kubelet"
}

PLAY RECAP ************************************************************************************************************************************************************************************
192.168.2.103              : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Tag的影响

当使用import_role时,会把import_role这个task的tag添加到role里面的每个task上。

比如playbook如下:

代码语言:javascript
复制
---
- hosts: ["all"]
  gather_facts: no
  tasks:
  - name: task1
    import_role:
      name: kubelet
    tags: ["t1"]

roles/kubelet/tasks/main.yml如下:

代码语言:javascript
复制
---
- name: 安装kubelet
  debug:
    msg: "install kubelet"
  tags: ["t2"]

- name: 安装docker
  debug:
    msg: "install docker"
  tags: ["t3"]

经过验证,当我们执行这个playbook,使用--tags t1--tags t2,t3时,两个task都会被执行

代码语言:javascript
复制
$ ansible-playbook --tags t1 playbook.yml 

PLAY [all] ************************************************************************************************************************************************************************************

TASK [安装kubelet] ******************************************************************************************************************************************************************************
ok: [192.168.2.103] => {
    "msg": "install kubelet"
}

TASK [kubelet : 安装docker] *********************************************************************************************************************************************************************
ok: [192.168.2.103] => {
    "msg": "install docker"
}

PLAY RECAP ************************************************************************************************************************************************************************************
192.168.2.103              : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

而使用--tags t2时,只有 安装kubelet 会被执行。

执行role中特定的task文件

如果role中有多个task文件,我们可以通过下面的方法来指定执行哪个task文件中的task,比如我们如果想执行roles/kubelet/tasks/install.yml中的task

代码语言:javascript
复制
---
- hosts: ["all"]
  gather_facts: no
  tasks:
  - import_role:
      name: kubelet
      tasks_from: install.yml

include_role

使用方法

前面我们可以在playbook当中通过role来引用role,我们还可以通过include_role来引用role,如下:

代码语言:javascript
复制
---
- hosts: ["all"]
  tasks:
  - name: task1
    include_role:
      name: kubelet

动态引用

import_role相比,include_role是一种动态引用。所谓动态引用,就是在执行阶段,才知道整个playbook要执行哪些任务,具体的表现如下:

  • 1、引用的role的名字允许使用变量
  • 2、include_role本身会被当作是一个task

比如如下,在include_role的task的名字为task1

代码语言:javascript
复制
---
- hosts: ["all"]
  gather_facts: no
  tasks:
  - name: task1
    include_role:
      name: kubelet

我们在执行发现,task的名字中并不会有这个task:

代码语言:javascript
复制
$ ansible-playbook playbook.yml 

PLAY [all] ************************************************************************************************************************************************************************************

TASK [task1] **********************************************************************************************************************************************************************************

TASK [安装kubelet] ******************************************************************************************************************************************************************************
ok: [192.168.2.103] => {
    "msg": "install kubelet"
}

TASK [kubelet : 安装docker] *********************************************************************************************************************************************************************
ok: [192.168.2.103] => {
    "msg": "install docker"
}

PLAY RECAP ************************************************************************************************************************************************************************************
192.168.2.103              : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Tag的影响

当使用include_role时,include_role本身的tag不会传递给它所引用的task。

比如playbook如下:

代码语言:javascript
复制
---
- hosts: ["all"]
  gather_facts: no
  tasks:
  - name: task1
    include_role:
      name: kubelet
    tags: ["t1"]

roles/kubelet/tasks/main.yml如下:

代码语言:javascript
复制
---
- name: 安装kubelet
  debug:
    msg: "install kubelet"
  tags: ["t2"]

- name: 安装docker
  debug:
    msg: "install docker"
  tags: ["t3"]

经过验证,当我们执行这个playbook,使用--tags t1时,只会执行task1这个task

代码语言:javascript
复制
$ ansible-playbook --tags t1 playbook.yml 

PLAY [all] ************************************************************************************************************************************************************************************

TASK [task1] **********************************************************************************************************************************************************************************

PLAY RECAP ************************************************************************************************************************************************************************************

而使用--tags t2,t3时,都不会执行

代码语言:javascript
复制
ansible-playbook --tags t2,t3 playbook.yml 

PLAY [all] ************************************************************************************************************************************************************************************

PLAY RECAP ************************************************************************************************************************************************************************************

只有使用--tags t1,t2,t3时,三个task才会都被执行(已验证)

执行role中特定的task文件

如果role中有多个task文件,我们可以通过下面的方法来指定执行哪个task文件中的task,比如我们如果想执行roles/kubelet/tasks/install.yml中的task

代码语言:javascript
复制
---
- hosts: ["all"]
  gather_facts: no
  tasks:
  - include_role:
      name: kubelet
      tasks_from: install.yml
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • role
    • 目录结构
      • Tags的影响
        • 执行role中指定的task文件
        • import_role
          • 使用方法
            • 静态引用
              • Tag的影响
                • 执行role中特定的task文件
                • include_role
                  • 使用方法
                    • 动态引用
                      • Tag的影响
                        • 执行role中特定的task文件
                        相关产品与服务
                        容器服务
                        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档