ANSIBLE:如何从库存组追加变量

ANSIBLE:如何从库存组追加变量,ansible,yaml,Ansible,Yaml,我有一份可分解的清单,其分组如下: +hosts/ +all/ +group_vars/ - linux.yml - webserver.yml - dbserver.yml ... 我有一本为主持人设置监控的剧本;这种监控是由插件完成的。因此,在每个组中,y设置一个包含插件的监控插件列表,以便能够监控每个服务。 在每组yml中,我尝试将其添加到列表中: monitoring_plugins: {{ monitoring_plugins|default([]

我有一份可分解的清单,其分组如下:

  +hosts/
  +all/
  +group_vars/
    - linux.yml
    - webserver.yml
    - dbserver.yml
...
我有一本为主持人设置监控的剧本;这种监控是由插件完成的。因此,在每个组中,y设置一个包含插件的监控插件列表,以便能够监控每个服务。 在每组yml中,我尝试将其添加到列表中:

monitoring_plugins: {{ monitoring_plugins|default([]) + [ 'whatever_plugin_correspond_to_group' ] }}
但是它并没有像预期的那样工作,如果一个主机属于多个组,那么它应该有对应于这些组的插件

有没有办法解决这个问题


提前感谢。

您所描述的应该在任务中按预期工作,但是您不能在vars或group_vars yaml或json文件中有可执行代码-这些是静态的

因此,您需要在较低级别设置一个不同的名称,然后在最高级别将其上卷:

group_vars/
  dbserver.yml  # sets monitoring_plugins_dbserver: ["a", "b"]
  linux.yml     # sets monitoring_plugins_linux: ["c", "d"]
然后在你的任务中,类似这样的东西,但事先警告我,我没有测试这个具体的例子:

-设定事实: 监控插件:>- {%set results=[]%} {%g在groups.keys%} {%set}=results.extendvars['monitoring_plugins}+g]| d[]%} {%endif%} {{results}}
哇,很好的例子,谢谢分享。下划线变量集是什么?下划线与任何其他变量一样,您也可以使用任何其他变量名,但在这样的操作中,变量值无关紧要,通常使用下划线作为变量名。这是一个非常优雅的解决方案。我将投票认为它是正确的,但我认为ansible应该解决这个问题,而不需要在每个剧本/角色上添加任务来积累变量。谢谢