我正在研究这个从加密数据包项目中分配api密钥的方法。要检索数据包项目,我在查询中使用chef属性。这就是我正在做的分配属性
ruby_block "get_my_region" do
block do
node.set['aws']['account_number'] = `curl -s http://169.254.169.254/latest/dynamic/instance-identity/document|grep region|awk -F\\" '{print $4}'`.chop
node.save
end
action :create
end
ruby_block "get_account" do
block do
node.set['aws']['region'] = `curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | grep -oP '(?<="accountId" : ")[^"]*(?=")'`.chop
node.save
end
action :create
end
一旦属性被分配,我正在调用模板以使用分配的属性到配置文件
template '/etc/default/polymur-proxy' do
source 'polymur-proxy.erb'
notifies :restart, 'service[polymur-proxy]', :delayed
variables(
api_key: (api_keys["#{node['aws']['region']}"]["#{node['aws']['account_number']}"]["key"]).to_s,
)
end
问题是在调试时我可以看到属性被分配了正确的值但是在查询中使用它们时它们返回空。如果任何人有任何建议,这将是有帮助的
答案 0 :(得分:0)
您遇到Chef's two pass执行模型,在ruby_block资源调用之前评估模板变量。您可以使用惰性块包装api_keys
。
但是,无需在AWS元数据终结点上手动调用curl。 Chef's ohai ec2插件无论如何都会提取它们 - node["ec2"]["account_id"]
和node["ec2"]["availability_zone"]
(只需在此处删除az id tr
或gsub
)。您可以将此权限传递给模板,甚至可以直接在模板中使用node
。