角色依赖关系允许您在使用角色时自动拉入其他角色。
角色依赖是先决条件,而不是真正的依赖。角色没有父/子关系。Ansible加载所有列出的角色,首先运行依赖项下列出的角色,然后运行列出它们的角色。play对象是所有角色的父对象,包括由依赖项列表调用的角色。
角色依赖项存储在meta/main.yml中,此文件应包含要在指定角色之前插入的角色和参数列表。 这个文件期望有一个顶级的数据hash, 使用dependencies键。
# roles/myapp/meta/main.yml
---
dependencies:
- role: common
vars:
some_parameter: 3
- role: apache
vars:
apache_port: 80
- role: postgres
vars:
dbname: blarg
other_parameter: 12
上述例子中,ansible会首先处理common角色(以及它可能表达的任何依赖),然后继续apache角色,再继续执行postgres角色,最后开始角色自己的任务。
一般情况下,依赖角色任务仅执行一次,且在第一个定义的角色中执行,那么,如何使两个不同的角色执行相同的依赖角色呢?
# 将依赖角色的meta/main.yml文件设置如下参数
allow_duplicates: true
如上例所示,我们将allow_duplicates属性设置为true,表示可以重复调用同一个角色。
Ansible只在一个play中执行每个角色一次,即使你多次定义它,除非角色上定义的参数对于每个定义是不同的。例如,Ansible在一个游戏中只运行一次角色foo,就像这样:
---
- hosts: webservers
roles:
- foo
- bar
- foo
有两个方法可以强制Ansible多次运行一个角色。
方法一、传递不同的参数
如果在每个角色定义中传递不同的参数,ansible会运行运行该角色不止一次。提供不同的变量值与传递不同的角色参数是不同的。对于这种行为,必须使用roles关键字,因为import_role和include_role不接受角色参数。
---
- hosts: webservers
roles:
- { role: foo, message: "first" }
- { role: foo, message: "second" }
或者
---
- hosts: webservers
roles:
- role: foo
message: "first"
- role: foo
message: "second"
方法二、使用allow_duplicates: true
在依赖的角色中meta/main.yml文件添加allow_duplicates: true即可。
# playbook.yml
---
- hosts: webservers
roles:
- foo
- foo
# roles/foo/meta/main.yml
---
allow_duplicates: true
角色containerd依赖角色,如下所示:
# vim containerd/meta/main.ym
---
dependencies:
- role: container-engine/containerd-common
- role: container-engine/runc
- role: container-engine/crictl
- role: container-engine/nerdctl
角色docker依赖角色,如下所示:
# vim docker/meta/main.ym
---
dependencies:
- role: container-engine/containerd-common
- role: container-engine/docker-storage
when: docker_container_storage_setup and ansible_os_family == "RedHat"
角色containerd和角色docker都依赖containerd-common角色,所以需要将containerd-common角色中的meta/main.yml文件设置如下内容:
# vim containerd-common/meta/main.yml
---
allow_duplicates: true
标签可以应用到依赖角色中发现的所有任务上,和前面包含任务文件中传入标签类似,标签可以是列表,也可以是单个项目。在条件中不能防止依赖角色的处理,但是给依赖应用条件可以跳过依赖角色层级中的所有任务,这是任务包含中使用条件的镜像功能。
---
dependencies:
- role: container-engine/cri-o
when:
- container_manager == 'crio'
tags:
- container-engine
- crio
- role: container-engine/containerd
when:
- container_manager == 'containerd'
tags:
- container-engine
- containerd
Ansible的Galaxy工具,类似程序员使用的 GitHub。运维人员可以将自己编写的Role通过Galaxy这个平台进行分享。同样,我们也可以通过Galaxy这个平台去获取一些我们想要的 Role。
# 安装角色
ansible-galaxy install -p installpath username.rolename
# 列出安装角色
ansible-galaxy list -p installpath
# 查看安装角色信息
ansible-galaxy info -p installpath username.rolename
# 删除角色
ansible-galaxy remove -p installpath username.rolename
# 创建角色
ansible-galaxy init role-name
更多详细内容请参考:《Linux运维篇:Linux系统运维指南》