如何标记多个资源从属性中懒惰地读取它们?

Posted

技术标签:

【中文标题】如何标记多个资源从属性中懒惰地读取它们?【英文标题】:How to tag multiple resources reading lazily them from an attribute? 【发布时间】:2021-03-04 19:28:06 【问题描述】:

我想标记多个 AWS 实例,它们的实例 ID 存储在一个属性中,例如-

aws
  |_ instances
            |____ 0: i-12sdfddf
            |____ 1: i-23fdgfdg
            |____ 2: i-34rtetio

这里,在读取节点数据的时候,我得懒加载。以下对我来说很好 -

    aws_resource_tag 'tag_instances' do
        resource_id lazynode['aws']['instances'][0]
        tags (tag)
    end

    aws_resource_tag 'tag_instances' do
        resource_id lazynode['aws']['instances'][1]
        tags (tag)
    end
.. and so on

但我想在一个循环中标记所有实例。像这样 -

aws_resource_tag 'tag_instances' do
  resource_id lazy node['aws']['instances'].values
  tags (tag)
end

我是新手,请帮忙。

更新:

根据@seshadri_c 的回答,这里存在一个错误-bug#243。

有解决办法吗?这样的事情会有所帮助 -

instance_values = lazy node['aws']['instances']

instance_values.each do |index, instance_id|
  aws_resource_tag 'ec2_instances' do
    resource_id instance_id
    tags(tags)
  end
end

【问题讨论】:

示例属性和单个resource_id 显示[aws][instance],但您想循环使用['ebs']['volumes']?您能用该属性的示例更新问题吗? 谢谢,@seshadri_c .. 更新了问题。 【参考方案1】:

aws_resource_tag 资源的resource_id 属性可以采用一组实例。所以我们可以从node['aws']['instances'] 哈希中取出values

aws_resource_tag 'tag_instances' do
  resource_id lazy  node['aws']['instances'].values 
  tags (tag)
end

更新:

我认为我们在上游代码中遇到了bug。它已经开放 3 年多了。

但循环遍历 Hash 或 Array 的典型方法是使用 .each 迭代器。如果你能得到node['aws']['instances'] 没有 lazy,那么你可以使用类似下面的东西:

node['aws']['instances'].each do |indx, instance_id|
  aws_resource_tag 'ec2_instances' do
    resource_id instance_id
    tags(tags)
  end
end

【讨论】:

这给了我错误 - ArgumentError: expected params[:filters][0][:values][0] to be a String, got value ["i-12sdfddf", "i-23fdgfdg"] (class: Array) instead. 我认为我们遇到了bug。我更新了答案。 谢谢。我不能在没有lazy 的情况下使用node['aws']['instances'],因为该值稍后会在配方中设置。有解决方法吗?像 - values = lazy node['aws']['instances'] values.each do |indx, instance_id| aws_resource_tag 'ec2_instances' do resource_id instance_id tags(tags) end end 我认为这是不可能的。 lazy 不适用于变量赋值。它在 Chef 资源中工作。 你能用一个node['aws']['instances']在配方中设置的例子来更新这个问题吗?

以上是关于如何标记多个资源从属性中懒惰地读取它们?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Python 中的文件/流中懒惰地读取多个 JSON 值?

如何从 GCP 存储桶中读取 Apache Beam 中的多个文件

如何在谷歌地图上添加多个标记

如何在 Objective-C 中懒惰地设置 BOOL 属性

在 C++ 中,如何使用多个线程读取一个文件?

如何在 Blender 中有效地更改多个对象的相同参数?