《Ansible Playbook扩展:roles角色依赖、角色应用及角色共享》
创始人
2025-05-29 14:56:05

一、角色依赖

角色依赖关系允许您在使用角色时自动拉入其他角色。

角色依赖是先决条件,而不是真正的依赖。角色没有父/子关系。Ansible加载所有列出的角色,首先运行依赖项下列出的角色,然后运行列出它们的角色。play对象是所有角色的父对象,包括由依赖项列表调用的角色。

角色依赖项存储在meta/main.yml中,此文件应包含要在指定角色之前插入的角色和参数列表。 这个文件期望有一个顶级的数据hash, 使用dependencies键。

# roles/myapp/meta/main.yml
---
dependencies:- role: commonvars:some_parameter: 3- role: apachevars:apache_port: 80- role: postgresvars:dbname: blargother_parameter: 12

上述例子中,ansible会首先处理common角色(以及它可能表达的任何依赖),然后继续apache角色,再继续执行postgres角色,最后开始角色自己的任务。

一般情况下,依赖角色任务仅执行一次,且在第一个定义的角色中执行,那么,如何使两个不同的角色执行相同的依赖角色呢?

# 将依赖角色的meta/main.yml文件设置如下参数
allow_duplicates: true

如上例所示,我们将allow_duplicates属性设置为true,表示可以重复调用同一个角色。


1.1、在一个角色中多次依赖一个角色

Ansible只在一个play中执行每个角色一次,即使你多次定义它,除非角色上定义的参数对于每个定义是不同的。例如,Ansible在一个游戏中只运行一次角色foo,就像这样:

---
- hosts: webserversroles:- foo- bar- foo

有两个方法可以强制Ansible多次运行一个角色。

方法一、传递不同的参数

如果在每个角色定义中传递不同的参数,ansible会运行运行该角色不止一次。提供不同的变量值与传递不同的角色参数是不同的。对于这种行为,必须使用roles关键字,因为import_role和include_role不接受角色参数。

---
- hosts: webserversroles:- { role: foo, message: "first" }- { role: foo, message: "second" }

或者

---
- hosts: webserversroles:- role: foomessage: "first"- role: foomessage: "second"

方法二、使用allow_duplicates: true

在依赖的角色中meta/main.yml文件添加allow_duplicates: true即可。

# playbook.yml
---
- hosts: webserversroles:- 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-storagewhen: 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系统运维指南》

相关内容

热门资讯

年营收超2000亿,这家成立8... 如何带领新央企提高经营质量,迈上更高发展台阶,成为摆在朱华荣面前的现实难题。文|《中国企业家》记者马...
河北省农村信用社联合社党委原常... 6月27日消息,据河北省纪委监委消息:河北省农村信用社联合社党委原常委安献章涉嫌严重违纪违法,目前正...
国家开发银行在国际市场成功发行... 6月27日消息,国家开发银行24日在国际市场成功发行美元和欧元双币种债券,并将首次在迪拜交易所上市。...
AG600飞机生产线游客爆棚 6月27日消息,最近一段时间,去工厂打卡参观成为很多年轻人和亲子家庭的热门选择。 AG600飞机是我...
加拿大4月份GDP较上个月下降... 6月27日消息,加拿大4月份GDP较上个月下降0.1%,预估为持平,前值为上升0.1%。(广角观察)