辨析 role、import_role、include_role

网友投稿 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小时内删除侵权内容。

上一篇:docker 添加挂载目录 mount /mnt /Volume
下一篇:使用SpringMVC访问Controller接口返回400BadRequest
相关文章

 发表评论

暂时没有评论,来抢沙发吧~