首页 > 解决方案 > Ansible 库存:aws_ec2 模块——寻找工作“组:”函数的示例

问题描述

我有一个使用 aws_ec2 模块的动态 ansible 库存。一般来说,它工作得很好。但是,有一个问题。我曾多次尝试使用 'groups:' 关键字创建组,但所有尝试都失败了。文档有点稀疏——事实上,它是完整的:

groups: (dictionary)
Default:{}
Add hosts to group based on Jinja2 conditionals.

我尝试了许多语法,Jinja2、条件、声明,但到目前为止,还没有一个成功创建名为“foo”的组。有一段时间我想也许我需要传递一个返回真或假的小代码片段,从而包括或排除目标主机。情况似乎并非如此。我想知道这里是否有人使用过'groups:'关键字并且比我走得更远。我在谷歌搜索时发现很少。FWIW,我在 Linux 上使用 ansible 2.9.9。

一些不起作用的事情的例子:

---
plugin: aws_ec2

### fails to create a group
groups:
  foo: >-
    tags.get('Name') if tags.get('Name') == 'foo-server'

### returns every host in the AWS account. 
groups: 
  bar:
    - "{{ tags.get('Name') == 'bar-server' }}"

此外,这个模块很难使用 ansible 的调试工具。许多,比如剧本调试器,似乎不能正常工作,尽管我发现它们在其他情况下非常有用。在这种情况下,您可能对调试有任何提示,我们将不胜感激。

标签: ansiblejinja2ansible-2.xansible-inventory

解决方案


看起来你很接近

与许多事情一样,权威的“文档”是源代码。特别是他们使用“组”选项,该选项调用_add_host_to_composed_groups其中他们将groups:字典输入到包含所有主机变量的 Jinja2 评估上下文中。表达式已插入,{% if ... %}因此您不想{{在表达式中包含标记,只是“原始”jinja2 表达式

groups:
  foo: tags.get('Name') == 'foo-server'

请注意,我没有方便的环境来测试该库存脚本,但这就是理论


推荐阅读