文章目录- role
- **目录结构**
- **Tags的影响**
- **执行role中指定的task文件**
- import_role
- **使用方法**
- **静态引用**
- **Tag的影响**
- **执行role中特定的task文件**
- include_role
- **使用方法**
- **动态引用**
- **Tag的影响**
- **执行role中特定的task文件**
- **目录结构**
- **Tags的影响**
- **执行role中指定的task文件**
- **使用方法**
- **静态引用**
- **Tag的影响**
- **执行role中特定的task文件**
- **使用方法**
- **动态引用**
- **Tag的影响**
- **执行role中特定的task文件**
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
文件内容如下:
---
- 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:
代码语言: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
如下:
---
- 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:
代码语言: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
如下:
---
- 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