2012-08-27 88 views
23

我使用opscode nginx cookbook来配置我的节点上的nginx服务器。 nginx cookbook有一些默认属性,我想在我的角色(“web_server”)中重写。厨师:我如何覆盖角色中的默认属性?

这些都是我想重写属性:

default['nginx']['version'] = "1.2.2" # in cookbooks/nginx/attributes/default.rb 
default['nginx']['source']['prefix'] = "/opt/nginx-#{node['nginx']['version']}" # in cookbooks/nginx/attributes/source.rb 

在我的角色/ web_server.rb文件我有这样的事情:

name "web_server" 
description "Setup a web server" 
run_list "role[base]", "recipe[nginx]" 
override_attributes 'nginx' => { 
    'install_method' => "source", 
    'version' => "1.2.3", 
    'source' => { "prefix" => "/opt/nginx", "checksum" => nil } 
} 

然而,在运行时chef-客户端的nginx配方会忽略我的覆盖并使用默认配置。

我在这里做错了什么?

谢谢!

+0

您是否忘记将角色上传到厨师服务器(如果您正在使用它)? –

+6

您是否运行带有或不带自定义运行列表(-o)的chef-client?今天,我学习了(在调试2-3小时后),在覆盖运行列表时,不会使用角色/节点中设置的属性。 –

+2

我遇到了同样的问题:/我非常确定我在角色中设置了override_attributes,并且我只在我的属性文件中使用了默认值。我敢打赌,这是一种厨师的错误或什么。 –

回答

1

我可以猜到的唯一问题是这些属性必须被 force_overridden属性所覆盖。 此外,请确保您的运动列表可以覆盖您的属性(因为我对您安排角色文件的方式持怀疑态度)

0

您是否尝试过使用圆括号?我用圆括号尝试了你的例子,并得到了默认的属性重写。

# your roles/web_server.rb file 

override_attributes(
    'nginx' => { 
    'install_method' => "source", 
    'version' => "1.2.3", 
    'source' => { "prefix" => "/opt/nginx", "checksum" => nil } 
    } 
) 
4

属性优先图[1]显示,这四个选项排名您的角色上面:

12. An override attribute located in an environment 
13. A force_override attribute located in a cookbook attribute file 
14. A force_override attribute located in a recipe 
15. An automatic attribute identified by Ohai at the start of the chef-client run 

如果这些似乎并没有是原因,那么也许更改格式可能的帮助。我会写它想:

override_attributes(
    nginx: { 
    install_method: 'source', 
    version: '1.2.3', 
    source: { 
     prefix: '/opt/nginx', 
     checksum: [ ], 
    }, 
    } 
) 

[1] https://docs.chef.io/attributes.html#attribute-precedence

1

您还可以使用替代属性的角色编辑器(在网络或刀的作用编辑)

{ 
    "name": "web_server", 
    "description": "nginx version", 
    "json_class": "Chef::Role", 
    "default_attributes": { 

    }, 
    "override_attributes": { 
    "nginx": { 
     "version": "1.2.2" 
    } 
    }, 
    "chef_type": "role", 
    "run_list": [ 
    "recipe[]", 
    "recipe[]" 
    ], 
    "env_run_lists": { 

    } 
} 
3

按照Chef Attribute Preference文件,这应该工作:

name "web_server" 
description "Setup a web server" 
run_list "role[base]", "recipe[nginx]" 
default_attributes 'nginx' => { 
    'install_method' => "source", 
    'version' => "1.2.3", 
    'source' => { "prefix" => "/opt/nginx", "checksum" => nil } 
} 

你sh不得在角色中使用override_attributes。一旦你开始使用覆盖而不是默认值,你很快就会发现你已经使用了最强大的覆盖,并且没有更多的方法来覆盖它。改为使用default_overrides

优先级规则周围的属性,只使用default水平实际上是相当一致的:

  1. 如果有一个,从角色的属性时,例如,require_two_factor_authrole[single_sign_on]被迫真正与default_overrides,即使在QA
  2. 如果有一个,从环境属性被使用,例如,require_two_factor_auth被迫真正在production
  3. 如果有一个从属性配方中使用,例如,require_two_factor_auth设置为true在auth::two_factor
  4. 最后,从默认的属性文件理智默认属性是使用,例如,require_two_factor_auth = false

然而,它是个极不寻常不过,在所有这四个地方都要设置相同的属性。如果属性的正确值确实取决于配方,角色和环境,那么通常结果值将结合所有三个属性,并在每个级别设置不同的属性并将其组合在配方中。


如果这是行不通的,两种可能性是:没有上传到服务器

  • 重载运行列表与chef-client -o "recipe[nginx]",而不是chef-client -o role[web_server]或纯chef-client
    • 编辑角色如果情况并非如此,请提供更多细节。我一直都在使用它,它总是有效的,并且我会担心是否存在这种情况不如记录的情况。