【发布时间】:2015-03-29 07:07:30
【问题描述】:
快速上下文:我想编写一个根据实例所在的 AWS 区域动态更改的配方。我想安装 CodeDeploy 代理,它根据实例所在的区域从 S3 存储桶下载。因此,我需要一个设置为区域的属性
AWS 公共食谱有执行此操作的代码,但未设置为属性:
def instance_availability_zone
@@instance_availability_zone ||= query_instance_availability_zone
end
...
def query_instance_availability_zone
availability_zone = open('http://169.254.169.254/latest/meta-data/placement/availability-zone/', options = { proxy: false }) { |f| f.gets }
fail 'Cannot find availability zone!' unless availability_zone
Chef::Log.debug("Instance's availability zone is #{availability_zone}")
availability_zone
end
它甚至可以在同一个类中以某种方式使用我想要的格式
def create_aws_interface(aws_interface)
begin
require 'aws-sdk'
rescue LoadError
Chef::Log.error("Missing gem 'aws-sdk'. Use the default aws recipe to install it first.")
end
region = instance_availability_zone
region = region[0, region.length - 1]
...
所以我想将上面的区域设置为属性 node['was']['region'] 或类似的,但我缺乏这样做的技能。我想我需要把它放在一个定义中,然后以某种方式调用它?
问题总结:如何通过运行 ruby 代码(来自库文件)在 chef 中设置属性?
【问题讨论】:
-
node.set['was']['region']='value'呢? -
如果我不能让它工作,那就是后备。我真的更喜欢能够使用运行列表来处理 AWS 实例并完成它。另外,如果有人忘记执行此操作,那么 CodeDeploy 将无法工作,并且很难调试。
标签: ruby chef-infra cookbook