dra*_*ack 5 chef-infra chef-recipe
我有一本包含 2 个食谱的食谱。
属性/default.rb
default['vpn']['crt'] = 'nocrt'
默认配方具有创建通用 crt 文件的文件资源
file 'cert' do
path "/etc/vpn/#{node.default['network']['hostname']}.crt"
owner 'root'
group 'root'
mode '0644'
content node.default['vpn']['crt']
end
Run Code Online (Sandbox Code Playgroud)
在第二个配方中client.rb,我包含默认配方,为该“客户端”加载加密数据包并覆盖该属性。但它不会被覆盖。
include_recipe 'my-cookbook'
vault = ChefVault::Item.load('auth', 'client')
node.override['vpn']['crt'] = vault['crt']
...
Run Code Online (Sandbox Code Playgroud)
文件内容 == 'nocrt'
根据Chef 的 Attribute Precedence,它应该覆盖vault['crt'].
更新:
Javier Cortejoso:您的答案在文件资源中使用时有效。
但请考虑以下示例:
属性/default.rb:
default['network']['hostname'] = 'generic-host-name'
Run Code Online (Sandbox Code Playgroud)
在 recipes/default.rb 中:
Chef::Log.info(node['network']['hostname'])
Chef::Log.info(node.default['network']['hostname'])
Chef::Log.info(node.override['network']['hostname'])
Run Code Online (Sandbox Code Playgroud)
在 recipes/client.rb 中:
node.override['network']['hostname'] = 'client-host-name'
include_recipe 'cookbook::default'
Run Code Online (Sandbox Code Playgroud)
因此,即使我先将执行顺序更改为 client.rb 配方,然后在覆盖后使用 default.rb,它仍然为我提供主机名“generic-host-name”:
==> default: [2015-03-04T17:30:43+00:00] INFO: generic-host-name
==> default: [2015-03-04T17:30:43+00:00] INFO: generic-host-name
==> default: [2015-03-04T17:30:43+00:00] INFO: {}
Run Code Online (Sandbox Code Playgroud)
解决方案
我是个傻逼。我的 Vagrant 文件中有这两个:
chef.add_role "cookbook"
chef.add_recipe "cookbook::client"
Run Code Online (Sandbox Code Playgroud)
感谢 Javier Cortejoso 指出为我澄清了延迟属性加载。
IMO 看来该属性在编译后被覆盖file['cert']。这是一个“时间”问题,而不是一个“优先”问题。为了获得正确的食谱执行顺序,您可以注意以下几点:
执行顺序应首先运行覆盖属性 ( client.rb) 的配方,然后运行使用覆盖属性 ( default.rb) 的配方。
您还可以对内容的属性使用惰性属性评估。
所以你的default.rb应该是:
include_recipe 'my-cookbook::client'
file 'cert' do
path "/etc/vpn/#{node.default['network']['hostname']}.crt"
owner 'root'
group 'root'
mode '0644'
content lazy node.default['vpn']['crt']
end
Run Code Online (Sandbox Code Playgroud)