我有一本有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
在第二个配方client.rb
中,我包含默认配方,为其加载加密数据包"客户端"并覆盖该属性。但它没有被覆盖。
include_recipe 'my-cookbook'
vault = ChefVault::Item.load('auth', 'client')
node.override['vpn']['crt'] = vault['crt']
...
文件的内容==' nocrt'
根据Chef's Attribute Precedence,它应覆盖vault['crt']
的内容。
更新
Javier Cortejoso:您的答案在文件资源中使用时可以正常使用。
但请考虑一下这个例子:
属性/ default.rb:
default['network']['hostname'] = 'generic-host-name'
在recipes / default.rb中:
Chef::Log.info(node['network']['hostname'])
Chef::Log.info(node.default['network']['hostname'])
Chef::Log.info(node.override['network']['hostname'])
在recipes / client.rb中:
node.override['network']['hostname'] = 'client-host-name'
include_recipe 'cookbook::default'
即使我首先将执行顺序更改为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: {}
解
我是白痴的****。我在Vagrant文件中有这两个:chef.add_role "cookbook"
chef.add_recipe "cookbook::client"
感谢Javier Cortejoso指出澄清我的懒惰属性加载。
答案 0 :(得分:4)
IMO似乎在编译file['cert']
后覆盖了该属性。这是一个“时间”问题,而不是“优先”问题。为了获得正确的食谱执行顺序,您可能会注意一些要点:
执行顺序应首先运行覆盖属性(client.rb
)的配方,然后运行使用覆盖属性(default.rb
)的配方。
您还可以使用lazy attribute evaluation作为属性的内容。
所以你的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