厨师覆盖同一食谱中另一个食谱的属性

时间:2015-03-03 21:12:53

标签: chef 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

在第二个配方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指出澄清我的懒惰属性加载。

1 个答案:

答案 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