当您在另一个食谱中包含食谱时,如何覆盖属性。
看起来include配方使用默认属性而不是先前在run_list中运行的配方属性。
答案 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的所有内容。这也有控制两本烹饪书的执行顺序的额外好处。