最近我被警告存在 ansible 回调,它似乎是一种在给定条件下修改某些默认值的方法。
然而,我仔细阅读了 ansible 文档以及一些书籍、谷歌和源代码,但我无论如何也找不到这个简单问题的答案:
如何改变影响 ansible 回调行为的配置项?
-例如:查看代码,邮件回调似乎可以配置为通过可配置的 SMTP 主机将邮件发送到可配置的电子邮件地址。应如何/在何处/何时指定这些?
但是,如果邮件回调(以及回调的基类)有任何依据的话,实际上似乎有不标准配置机制..
例如,如果环境变量中存在 SMTPHOST,Mail 会从该变量中获取它,并且 to: 似乎被固定在 <root> 上(如果邮件程序坚持[电子邮件保护]作为有效地址)。
答案1
看看文档和一些现有的回调插件,一种方法似乎是使用环境。
例如,jabber回调只需使用“更多”环境变量即可实现更精细的配置。
对于许多其他回调来说似乎都是这种情况,并且我找不到任何使用 ansible 变量来实现此类目的的示例。
不过,这可能是可能的——检查CallbackBase#_get_item方法,似乎可以通过 ansible vars 来获取可能合适的配置。
然而,我确实认为使用环境变量似乎是某种形式的标准 - 尽管我同意它不是一个严格定义的标准,如果它确实是一个的话
正如你所说,回调有点模糊,这可能是 ansible 中的那些“如果你需要它,你就会知道该做什么”的区域之一。
对于邮件回调的情况,最好的选择就是将现有插件子类化,以添加您认为可能需要的配置变量。
我个人认为回调大体上被视为高级功能,并且许多可用的回调更适合作为基础(在某些情况下,作为快速获取某些东西的黑客手段),以供需要其功能的人进行扩展。但这纯粹是一种感觉。
答案2
我不确定我是否理解正确,但我认为你对回调或官方模块的黑匣子想法是正确的,
我认为 Python 模块就像 Unix 的“命令”,它们可以非常不同,接受不同的选项,而且这种架构让 Ansible 团队很难进行大的架构变更,因为这意味着修改/扩展所有现有模块(比如,运行模块时所要求的进度报告)。https://github.com/ansible/ansible/issues/3887这意味着他们无法检查模块是否卡住了)
为了控制配置或更改/保留它们,我选择了除了编写回调之外的另一种方法。
我使用动态库存功能在 ansible 周围编写了一个层,并使用输出回调插件将输出格式化为 json,以便能够解析成功运行的输出并将更改状态/数据保存回我的库存管理程序。这样,我可以通过简单的任务调用更改变量,甚至在剧本中添加主机,并自动将它们应用回我的库存,而无需大量修改或扩展 ansible,并与未来版本保持相对兼容。