数据包 'aws_opsworks_instance' 不可用

Data bag 'aws_opsworks_instance' not available

有谁知道为什么

instance = search('aws_opsworks_instance', 'self:true').first

# ...

    instance_host: instance['hostname']

会间歇性地导致

undefined method `[]' for nil:NilClass

在 OpsWorks 上?

我已经搜索了几个小时但没有找到任何东西,所以我开始认为这是副产品,而不是实际问题。

因为它每隔一段时间就会发生一次,我认为它可能是 "race condition"。也许 OpsWorks 需要一段时间才能注入这个,所以需要告诉 Chef 等待?如果是这样,我在文档中找不到任何此类内容。

知道为什么会发生这种情况以及它是如何发生的吗fixed/avoided?

这是 aws opswork 特有的。这是 aws documentation:

的摘录

Chef search with self:true finds the data bag item that contains information related to the instance that the recipe is being executed on.

从你的post中输出,instancenull,这是search()returns没有搜索结果时的值.

也许 运行 主厨客户 --log_level debug 会透露更多信息或尝试联系 aws 支持团队。

OpsWorks 似乎依赖于实例名称来识别这些数据包,因此由于我们的脚本请求同时创建多个新实例,因此在分配名称时存在一些冲突(即名称重复)。

通过将 OpsWorks 命名主题从 Greek_Deities_and_Titans(例如 hercules、zeus、poseidon)更改为 Layer_Dependent(例如 api1、api2、notifications1、notification2),避免了该问题。

虽然Opsworks命名两个同名实例的问题可能不是最终解决方案,但我还没有遇到使用Layer_Dependent命名的问题,所以至少几率大大降低了。