一、角色依赖
角色依赖关系允许您在使用角色时自动拉入其他角色。
角色依赖是先决条件,而不是真正的依赖。角色没有父/子关系。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,表示可以重复调用同一个角色。
1.1、在一个角色中多次依赖一个角色
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
1.2、在多个不同角色中依赖一个角色
角色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
依赖文件如果它们在同一目录下存在,或者在默认配置的roles_path中存在,那么可以通过不带任何前缀的名字来引用,否则,需要提供可以定位角色的完整路径。
当表达依赖的时候,能够给依赖传递数据。数据可以是变量、标签、甚至是条件。
总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:《Linux运维篇:Linux系统运维指南》