linux怎么查看本机内存大小
264
2022-10-21
辨析 role、import_role、include_role
文章目录
role
**目录结构****Tags的影响****执行role中指定的task文件**
import_role
**使用方法****静态引用****Tag的影响****执行role中特定的task文件**
include_role
**使用方法****动态引用****Tag的影响****执行role中特定的task文件**
role
目录结构
一个role可以包含以下八个目录
common/ tasks/ # 任务文件 handlers/ # handler文件 library/ files/ # 一般不变的文件,比如tar包 templates/ # 模板文件,需要替换变量,.j2文件 vars/ # 变量文件 defaults/ # 默认变量文件 meta/ # role的依赖关系
Tags的影响
当在play中直接使用role时,role的tag会传给它包含的每一个task,比如:
---- hosts: ["all"] gather_facts: no roles: - role: kubelet tags: ["t1"]
那么t1会传给roles/kubelet/tasks/main.yml中的每一个task。比如main.yml文件内容如下:
---- name: 安装kubelet debug: msg: "install kubelet" tags: ["t2"]- name: 安装docker debug: msg: "install docker" tags: ["t3"]
我们执行时添加--tags t1、--tags t2,t3,两个task都会被执行
$ 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_role和include_role那样通过tasks_from来指定执行哪一个task文件
import_role
使用方法
前面我们可以在playbook当中通过role来引用role,我们还可以通过import_role来引用role,如下:
---- 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的不允许使用变量(vars、vars-file除外)2、import_role本身不会被当作是一个task
比如如下,在import_role的task的名字为task1
---- hosts: ["all"] gather_facts: no tasks: - name: task1 import_role: name: kubelet
我们在执行发现,task的名字中并不会有这个task:
$ 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如下:
---- hosts: ["all"] gather_facts: no tasks: - name: task1 import_role: name: kubelet tags: ["t1"]
roles/kubelet/tasks/main.yml如下:
---- name: 安装kubelet debug: msg: "install kubelet" tags: ["t2"]- name: 安装docker debug: msg: "install docker" tags: ["t3"]
经过验证,当我们执行这个playbook,使用--tags t1或--tags t2,t3时,两个task都会被执行
$ 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
---- hosts: ["all"] gather_facts: no tasks: - import_role: name: kubelet tasks_from: install.yml
include_role
使用方法
前面我们可以在playbook当中通过role来引用role,我们还可以通过include_role来引用role,如下:
---- hosts: ["all"] tasks: - name: task1 include_role: name: kubelet
动态引用
和import_role相比,include_role是一种动态引用。所谓动态引用,就是在执行阶段,才知道整个playbook要执行哪些任务,具体的表现如下:
1、引用的role的名字允许使用变量2、include_role本身会被当作是一个task
比如如下,在include_role的task的名字为task1
---- hosts: ["all"] gather_facts: no tasks: - name: task1 include_role: name: kubelet
我们在执行发现,task的名字中并不会有这个task:
$ 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如下:
---- hosts: ["all"] gather_facts: no tasks: - name: task1 include_role: name: kubelet tags: ["t1"]
roles/kubelet/tasks/main.yml如下:
---- name: 安装kubelet debug: msg: "install kubelet" tags: ["t2"]- name: 安装docker debug: msg: "install docker" tags: ["t3"]
经过验证,当我们执行这个playbook,使用--tags t1时,只会执行task1这个task
$ ansible-playbook --tags t1 playbook.yml PLAY [all] ************************************************************************************************************************************************************************************TASK [task1] **********************************************************************************************************************************************************************************PLAY RECAP ************************************************************************************************************************************************************************************
而使用--tags t2,t3时,都不会执行
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
---- hosts: ["all"] gather_facts: no tasks: - include_role: name: kubelet tasks_from: install.yml
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~