厨师包括食谱覆盖属性

时间:2013-03-04 15:46:21

标签: attributes include override chef

当您在另一个食谱中包含食谱时,如何覆盖属性。

看起来include配方使用默认属性而不是先前在run_list中运行的配方属性。

2 个答案:

答案 0 :(得分:19)

在创建包装器手册时,通常会覆盖属性。

假设你有my_web_server/recipes/default.rb这样的my_web_server食谱:

include_recipe "apache2"

您想要从apache2 cookbook覆盖属性default_site_enabled。 然后您的文件my_web_server/attributes/default.rb应如下所示:

override['apache']['default_site_enabled'] = true

不要忘记在my_web_server/metadata.rb中指定依赖项,如:

depends "apache2"

答案 1 :(得分:5)

我经常使用角色来覆盖属性。

假设我有两本食谱,一本用于我的sweet_rails_app,一本用于安装/配置apache,乘客可以安装我的应用程序。

在我的sweet_rails_app_cookbook中,我可能有:

# coding: UTF-8
# Cookbook Name:: sweet_rails_app
# Recipe:: default
include_recipe 'apache_passenger_cookbook::default'
... # recipe code

两本cookbook中的所有属性都在cookbook中设置为默认级别。

# coding: UTF-8
name 'sweet_rails_app'
description 'Deploys Sweet Rails App'

run_list "recipe[sweet_rails_app_cookbook]"

base_dir = '/opt/sweet_rails_app'

override_attributes(
  sweet_rails_app: {
    base_dir: base_dir,
    ... # more override attributes
  },
  apache_passenger: {
    document_root: base_dir
  }
)

然后,角色就是我需要添加到节点的run_list的所有内容。这也有控制两本烹饪书的执行顺序的额外好处。