我正在努力找出如何覆盖Ansible模块选项默认值而不用手工变换它.如果有一种方法可以覆盖模块选项默认仅适用于主机的子集,那就更好了.
在几个主机上说,Git可以在/ bin / git中获得,正如预期的那样.在其他几个主机上,Git位于/usr/local/bin / git.如何覆盖后一组主机的git模块可执行选项默认值?
目前我正在设置一个主机组变量,如:
git_executable=/usr/local/bin/git
并使用默认(省略)过滤器git使用如下:
- git: "executable={{git_executable|default(omit)}} ..."
因此,它在已定义的主机上被正确覆盖,而在其他主机上被忽略.
可执行文件可能不是这里最好的例子,因为它可以用PATH环境变量或其他东西来控制.那么一般来说我想覆盖哪些模块选项只是为了一些主机,但是否则会回到模块默认值?
由于在这种环境中存在更多这样的基本差异,因此在整个地方使用变量进行这种默认查找是相当繁琐的,以防它在具有非默认设置的主机上运行.有没有办法更好地做到这一点?
最佳答案 我不认为有更好的选择.模块只知道你传递给他们的内容.除非您明确地将其作为模块参数传递,否则它们无权访问全局变量,服务器事实或其他任何内容.
如果这真的非常重要并且您想投入一些时间,那么您可以创建自己的动作插件. Action插件是本地操作,因此可以访问Ansible runnerc类及其所有属性,包括事实等.因此,您可以根据服务器事实处理默认参数或可执行检测,然后以编程方式调用git或任何模块.在我看来,巨大的开销,但这取决于观点,并可能在你的结束.
虽然要小心,但动作插件是100%未记录的. Ansible 2.0将在未来几天发布.他们声称100%向后兼容,但如果只计算记录的功能,我不会感到惊讶.