【问题标题】:How do I get EBS volume ids that are attached to an OpsWorks instance?如何获取附加到 OpsWorks 实例的 EBS 卷 ID?
【发布时间】:2014-11-19 03:47:00
【问题描述】:

我正在使用 OpsWorks 部署一堆应用程序,我想标记实例及其所有相关资源。我正在使用 opscode aws 食谱 (https://github.com/opscode-cookbooks/aws) 来标记我的实例,并且使用以下配方可以正常工作:

include_recipe 'aws'

custom_tags = node.fetch('aws_tag', {}).fetch('tags', nil)
instance_id = node.fetch('ec2', {}).fetch('instance_id', nil)

unless custom_tags.nil? || custom_tags.empty?
  aws_resource_tag 'tag instance' do
    tags custom_tags
    resource_id instance_id
    action :update
  end
end

我想扩展此配方以标记附加到实例的 EBS 卷。 aws_resource_tag() 可以标记实例、快照和卷,但我需要为其提供要标记的卷列表。

如何获取附加到实例的卷 ID?

【问题讨论】:

    标签: amazon-web-services chef-infra aws-opsworks


    【解决方案1】:

    我在http://docs.aws.amazon.com/opsworks/latest/userguide/attributes-json-opsworks-instance.html 中看不到任何内容,因此您可能只需要使用标准的 ohai 数据。连接到机器并运行ohai ec2,您将看到完整的元数据树。

    【讨论】:

    • 运行sudo opsworks-agent-cli get_json时生成的元数据中没有EBS信息。
    • Ohai 只是挖掘 Amazon 元数据服务器上存在的任何数据。
    • 默认情况下,Ohai 二进制文件未随实例一起安装。亚马逊的所有文档都说使用opsworks-agent-cli 来收集有关实例的信息。如果我们谈论的是同一件事,亚马逊似乎根本不包含这些数据。
    • Ohai 是 Chef 的内部组件,它与 OpsWorks 没有(直接)关系。
    • 好的,我明白了。但是,无论我做什么,我似乎都无法访问有关附加到实例的 EBS 卷的任何信息。我已经尝试将node 的内容转储到日志中以查看其中的内容,并且没有任何关于 EBS 的内容。
    【解决方案2】:

    首先您需要知道OpsWorks automatically tag 相关的层或堆栈资源,但​​标签当前无法应用于实例的根或默认 EBS 卷。

    如果您使用 OpsWorks for Windows Stack,我建议您从 Supermarket 安装以下说明书:

    文件metadata.rb

    depends 'aws', '4.2.2'
    depends 'ohai', '4.2.3'
    depends 'compat_resource', '12.19.1'
    

    接下来向您的堆栈添加一个具有执行list-tags for OpsWorkscreate-tags in the EC2 service 所需权限的IAM 角色。

    最后你可以使用这个食谱add-tags.rb

    Chef::Log.info("******TAGS VOLUME******")
    #Chef::Log.level = :debug
    instance = search("aws_opsworks_instance", "self:true").first
    stack = search("aws_opsworks_stack").first
    arnstack = "#{stack['arn']}"
    cmd = "aws opsworks list-tags --resource-arn #{arnstack} --region eu-west-1"
    Chef::Log.info("****** #{arnstack} ******")
    batch  'find_tags' do
      cwd "C:\\Program Files\\Amazon\\AWSCLI"
      code <<-EOH
      #{cmd} > C:\\tmp\\res.json
      EOH
    end
    if ::File.exist?('C:\\tmp\\res.json')
      myjsonfile = ::File.read('C:\\tmp\\res.json').chomp
      data = JSON.parse("#{myjsonfile}")
      data['Tags'].each do |key, value|
        aws_resource_tag 'Boot Volume' do
            resource_id lazy {instance['root_device_volume_id']}
            tags(key => value)
        end
      end
    end
    

    该配方仅将基于堆栈的所有 TAG 添加到我的实例的根卷。

    【讨论】:

      最近更新 更多