14

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

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

4

2 回答 2

20

创建包装说明书时,通常会覆盖属性。

假设,你有这样的 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"
于 2013-03-27T18:59:43.673 回答
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 的全部内容。这还有一个额外的好处,那就是控制两个食谱的执行顺序。

于 2013-04-02T05:20:42.583 回答