【问题标题】:Configure Ansible roles with dependent roles使用依赖角色配置 Ansible 角色
【发布时间】:2014-06-30 18:13:21
【问题描述】:

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

有两个角色:

  • mailserver:一个基本的邮件服务器配置
  • mailinglist: 邮件列表申请

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

我想做的是:

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

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

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

【问题讨论】:

  • 您报告您不能使用dotdeeassemble,因为它们无法组装线。你能给我们一个mailserver所需的配置语法示例吗?
  • 类似于transport_config = file:/etc/mailserver/transport_foo, file:/etc/mailserver/transport_bar
  • 该语法是否允许续行?喜欢用`\`完成一行以继续下一行的内容?也许像这样,您可以使用assemble 将每个传输单独放在一行中并继续。

标签: ansible ansible-role


【解决方案1】:

您可以使用role dependencies 完成此操作。

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

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

对任何其他类似的角色做同样的事情。

【讨论】:

  • 正如问题中所写,不可能这样做。还是谢谢!
  • 其实你误解了我的回答。角色依赖存在于邮件列表角色中。也依赖于mailserver 的其他角色可以在自己的meta/main.yml 中拥有自己的依赖关系,transport_config 变量会相应变化。请重新考虑答案。
  • 但这会多次运行邮件服务器角色,每次都会覆盖最后的邮件服务器配置。
【解决方案2】:

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

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

【讨论】:

  • 很好,不知道这个模块。遗憾的是,它不适用于我的示例,因为传输配置发生在配置文件的一行中。例如。 transport_config = foo:bar, foo2:bar2, ....
  • 在我的用例中,逗号分隔的值可以分割多行,所以这确实有效。它可能适用于大多数用例。
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

    考虑使用dotdee 之类的东西管理mailserver 配置文件:

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

    在您的情况下,mailinglist 角色和其他依赖于mailserver 的角色将在.d 目录(由mailserver 角色创建)中删除配置 sn-ps 并运行命令以更新mailserverdotdee --update /path/to/mailserver/conf这样的配置文件。

    【讨论】:

    • 看起来像 Ansible 的 assemble 模块,但有同样的弱点,即它不能组装行,只能组装文件。
    【解决方案5】:

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

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

    【讨论】:

    • 也许我弄错了,但这并不能解决我的问题,因为角色本身为底层角色提供了配置。在我的示例中,我不想配置传输,因为这是“实现细节”。
    猜你喜欢
    • 2021-07-25
    • 2019-01-14
    • 2016-04-13
    • 2017-05-06
    • 2016-06-27
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    相关资源
    最近更新 更多