Chef 设置库中的属性 code/definition

Chef set attribute from library code/definition

快速上下文:我想编写一个根据实例所在的 AWS 区域动态变化的配方。我想安装 CodeDeploy 代理,它根据实例的区域从 S3 存储桶下载。因此,我需要一个设置为 region

的属性

AWS public 说明书有执行此操作的代码,但未设置属性:

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

它甚至在相同的 class 中使用,以某种方式获得我想要的格式的区域

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]
...

所以我想将上面的区域设置为属性节点['was']['region']之类的,但我缺乏这样做的技巧。我想我需要把它放在一个定义中然后以某种方式调用它?

问题总结:如何通过 运行 ruby 代码(来自库文件)在 chef 中设置属性?

这是食谱:https://github.com/opscode-cookbooks/aws

你可以让 ohai 来做这些工作。

node[ec2][placement_availability_zone]由ohai设置。您只需要从整个 AZ 字符串中解析出该区域。

我相信

node[ec2][placement_availability_zone].match(/.*-\d/) 会成功的。

如果您使用的是 VPC 节点,则需要为 ohai 添加 ec2 提示。这可以通过在引导节点时传递 --hint ec2 来最容易地实现。