【问题标题】:How to exclude instances of the EC2 inventory in Ansible?如何在 Ansible 中排除 EC2 清单的实例?
【发布时间】:2019-01-30 10:09:17
【问题描述】:

我们有一个使用 EC2 动态清单的 Ansible 服务器:

但是,根据我们拥有的实例数量,运行 ./ec2.py --list./ec2.py --refresh-cache 会返回 28,000 行 JSON 响应。

我假设这会导致它随机失败(返回 Python 堆栈跟踪),因为它在向 AWS 发送调用时只收到部分响应,但如果再次运行就可以了。

这就是为什么我想知道是否有办法减少这种情况。

我知道有一种方法可以在 ec2.ini 中按标签包含特定实例(即# instance_filters = tag:env=staging),但使用 我们的实例被标记的方式,有没有办法排除 而是实例(类似于:# instance_filters = tag:name=!dev)?

【问题讨论】:

  • 我认为这会导致它随机失败(返回 Python 堆栈跟踪) 您是否打开了 ansible 显示该堆栈跟踪的问题?因为你可能解决了错误的问题——我可以理解一个巨大的 JSON blob 看起来很难看,但对于计算机来说这应该不是问题,特别是如果 cache_max_age 是一个合理的值
  • 如果库存随机失败,我将支持@MatthewLDaniel 的评论,这不是预期的行为,因此请将其报告给 Ansible github 存储库。

标签: amazon-ec2 ansible ansible-inventory


【解决方案1】:

有没有办法排除实例

为了完整起见,我想指出 ansible 的“库存协议”实现起来非常简单,他们甚至有一个 JSON Schema

您可以通过使用--list 运行新包含的ansible-inventory 脚本来查看它所期望的输出示例,以查看它从.ini 样式清单之一生成的输出,然后使用它来发出您的自己的:

$ printf 'somehost ansible_user=bob\n\n[some_group]\nsomehost\n' > sample
$ ansible-inventory -i ./sample --list

我的建议是,您最好制作一个自定义库存脚本,确实了解您当地的商业惯例,而不是试图强制 ec2.py 运行否定查询(这,据我所知,它不会这样做)。

要生成动态清单,只需制作一个可执行文件——据我所知,它可以是任何语言——然后将-i 指向可执行脚本而不是“普通”文件。 Ansible 将调用该程序,并将 JSON 输出作为清单进行操作。有several examples 人以各种语言发布了要点。

如果您向 ansible 提交关于 ec2.py 的问题,我仍然会喜欢它,因为您的情况可以使错误报告具体化,以简单的“它不适用于大量库存”的方式不捕获。但与此同时,编写自己的库存提供程序实际上比听起来要少。

【讨论】:

    【解决方案2】:

    我在 ec2.ini 中使用了选项pattern_exclude

    # If you want to exclude any hosts that match a certain regular expression
    pattern_exclude = staging-*
    

    hostname_variable = tag_Name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 2019-10-24
      • 2020-01-31
      • 2015-06-14
      • 2015-01-15
      • 1970-01-01
      相关资源
      最近更新 更多