12

最好用一个例子来描述这个问题:

有两个角色:

  • mailserver: 一个基本的邮件服务器配置
  • mailinglist: 邮寄名单申请

邮件列表软件需要邮件服务器将收到的邮件传输到邮件列表软件的“虚拟收件箱”。这需要对邮件服务器进行一些配置。但是邮件服务器不知道邮件列表角色,也不知道其他具有类似配置要求的角色。

我想做的是:

  • mailinglist(和其他类似角色)将传输配置存储在变量transport_config中。这可能是一个“传输图”,例如 $email => $spool。
  • mailinglist取决于mailserver角色。
  • mailserver使用变量配置它的“传输” transport_config

有没有办法在 Ansible 中做这样的事情?或者这个问题的另一种解决方案?不能使用角色变量,如,因为根据邮件服务器的{role: mailserver, transport_config: ...}不同,可能有多个角色。

我能想到的是一种解决方法:邮件服务器读取/解析定义传输映射的配置目录。mailinglist和其他角色将文件添加到此目录。这里的问题是,这通常需要一个“配置构建器”来读取这些配置目录并生成主配置文件。

4

5 回答 5

23

您可以使用角色依赖项来完成此操作。

mailinglist下的角色中roles/mailinglist/meta/main.yml,添加如下内容:

---
dependencies:
  - { role: mailserver, transport_config: ... }

对任何其他类似的角色执行相同的操作。

于 2014-07-14T22:47:27.503 回答
4

针对您对“配置构建器”的评论,请参阅assemble ansible 模块。棘手的部分可能是在运行 assemble 模块之前将所有文件放到一个位置。

否则,tima 对 host_ 和 group_vars 的建议是有道理的。

于 2014-07-08T20:17:47.023 回答
4

我知道这个答案很长,但我只是找到了一个可行的解决方案,而且有点偷偷摸摸。

我使用第三个settings角色,它没有任务,只有defaults/main.yml. 文档对此有点含糊,但此处的值会影响所有相关角色,因此如果两个角色都依赖于settings它们的meta/main.yml文件,则两者都会获得一组共同的值。这些可以通过group_vars文件以通常的方式覆盖。

令我惊讶的是,因为,是的,settings角色被多次使用,所以没关系,因为其中没有任务,并且数据可以从那里沿着依赖链向上流动。

这是 Ansible 中一种全新的数据流形式,我不知道这是可能的。

于 2016-12-21T20:23:07.410 回答
2

考虑使用以下内容管理mailserver配置文件dotdee

使用dotdee,您可以从目录中的一系列文件组装您的最终配置文件.d

在您的情况下,mailinglist角色和其他依赖mailserver项会将配置片段放在.d目录中(由mailserver角色创建)并运行命令来更新mailserver配置文件,例如dotdee --update /path/to/mailserver/conf.

于 2015-07-06T15:48:59.457 回答
0

可以肯定的是,我对您的应用程序还不够熟悉,但我认为使用主机或组变量将您的配置传递给您的角色可能会更好。这些角色可以保存您的默认值等,并期望检索您单独设置的主机/组变量值。这可能意味着将每个应用程序实例视为宿主而不是心理宿主。您如何对其进行建模取决于您的工作流程、配置和应用程序中的许多细节。

这个最近的线程涉及到一些这样的事情:https ://groups.google.com/forum/#!topic/ansible-project/yrnsx2Mw6rc

于 2014-07-06T18:11:19.083 回答