2013-03-04 100 views
12

当您在另一个配方中包含配方时,您如何覆盖属性。厨师包括配方覆盖属性

它看起来包含的配方使用了默认属性,而不是配方的属性,因为它先前在run_list中运行。

回答

15

当您创建包装食谱时,通常会覆盖属性。

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

include_recipe "apache2" 

你想覆盖从Apache2的食谱default_site_enabled属性。 然后你的文件my_web_server/attributes/default.rb应该是这样的:

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

而且不要忘记在my_web_server/metadata.rb指定喜欢的依赖关系:

depends "apache2" 
+1

这是否只适用于厨师服务器? Chef solo使用Chef 12.0.3似乎不适合我。 – Noz 2014-12-19 17:39:57

+0

非常感谢您的支持,需要一些类似的信息来覆盖chef_nginx食谱上的属性。 – WhyAyala 2017-02-03 22:24:14

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 

两个食谱设定在任食谱默认级别的所有属性。

# 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的所有东西。这也有控制两个食谱的执行顺序的额外好处。