我正在使用OpsWorks来部署一堆应用程序,我想标记实例及其所有相关资源。我正在使用opscode aws cookbook(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附加到实例?
我在http://docs.aws.amazon.com/opsworks/latest/userguide/attributes-json-opsworks-instance.html中没有看到任何内容,所以你可能只需要使用标准的ohai数据。连接到机器并运行ohai ec2
,您将看到完整的元数据树。
首先,您需要了解OpsWorks automatically tag关联的图层或堆栈资源,但标签目前无法应用于实例的根或默认EBS卷。
如果您使用OpsWorks for Windows Stack,我建议您从超市安装以下食谱:
文件metadata.rb
depends 'aws', '4.2.2'
depends 'ohai', '4.2.3'
depends 'compat_resource', '12.19.1'
接下来,向您的堆栈添加具有执行list-tags for OpsWorks和create-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添加到我的实例的根卷。