最好用一个例子描述问题:
有两个角色:
mailserver
:基本邮件服务器配置mailinglist
:邮件列表应用邮件列表软件需要邮件服务器将传入的邮件传输到邮件列表软件的虚拟收件箱"。这需要一些邮件服务器的配置。但邮件服务器不知道邮件列表角色,也不了解具有类似配置要求的其他角色。
我想做的是:
mailinglist
(以及其他类似角色)将传输配置存储在变量transport_config
中。这可能是一个"运输地图"喜欢$ email => $卷轴上。mailinglist
取决于mailserver
角色。mailserver
配置它"运输"使用变量transport_config
。有没有办法在Ansible中做这样的事情?或者这个问题的另一个解决方案 可以使用{role: mailserver, transport_config: ...}
等角色变量,因为根据邮件服务器的不同,可能会有多个角色。
我能想到的是一种解决方法:邮件服务器读取/解析定义传输映射的配置目录。 mailinglist
和其他角色将文件添加到此目录。这里的问题是,这通常需要一个配置构建器"它读取这样的配置目录并生成主配置文件。
答案 0 :(得分:20)
您可以使用role dependencies完成此操作。
在mailinglist
下的roles/mailinglist/meta/main.yml
角色中,添加以下内容:
---
dependencies:
- { role: mailserver, transport_config: ... }
对任何其他类似角色也这样做。
答案 1 :(得分:3)
在回复您对"配置构建器"的评论时,请参阅assemble ansible module。在运行汇编模块之前,棘手的部分可能是将所有文件放到一个位置。
否则,tima对host_和group_vars的建议是有道理的。
答案 2 :(得分:2)
考虑使用mailserver
:
dotdee
配置文件
dotdee
repository 使用dotdee
,您可以从放置在.d
目录中的一系列文件中汇总最终配置文件。
在您的情况下,mailinglist
角色和其他依赖于mailserver
的角色会丢弃.d
目录(由mailserver
角色创建)中的配置片段并运行命令更新mailserver
配置文件,如dotdee --update /path/to/mailserver/conf
。
答案 3 :(得分:2)
我知道这个问题已经得到了很好的回答,但我只是找到了一个可行的解决方案,而且它有点偷偷摸摸。
我使用第三个settings
角色,该角色没有任务,只有defaults/main.yml
中的变量。文档在这方面有点模糊,但是这里的值会被所有依赖角色涟漪,所以如果两个角色都依赖于settings
通过他们的meta/main.yml
文件,两者都会产生共同点一组价值观。这些都可以通过group_vars
文件以通常的方式覆盖。
令我惊讶的是,既然如此,settings
角色不止一次被使用,它没关系,因为其中没有任务,而且数据可以从那里流出来的依赖关系。
这是Ansible中一种全新的数据流形式,我不知道是不可能的。
答案 4 :(得分:0)
我对您的应用程序不太熟悉,但我认为使用主机或组变量将您的配置传递给您的角色可能会更好。角色可以保留您的默认值等,并期望检索您单独设置的主机/组变量值。这可能意味着将每个应用程序实例视为主机而非心理主机。您如何建模它取决于您的工作流程,配置和应用程序中的许多细节。
这个最近的主题涉及到某些事情:https://groups.google.com/forum/#!topic/ansible-project/yrnsx2Mw6rc