我正在使用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
Run Code Online (Sandbox Code Playgroud)
在我的角色/ 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 }
}
Run Code Online (Sandbox Code Playgroud)
但是,在运行chef-client时,nginx配方会忽略我的覆盖并使用默认值.
我在这做错了什么?
谢谢!
根据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 }
}
Run Code Online (Sandbox Code Playgroud)
你不应该override_attributes在角色中使用。一旦开始使用替代而不是默认替代,您很快就会发现自己已经使用了最强的替代,而没有其他替代方法。使用default_overrides代替。
default实际上,仅使用级别的属性优先级规则几乎相同:
require_two_factor_auth必须使用default_overridesin 强制将其设置为truerole[single_sign_on]require_two_factor_auth在productionrequire_two_factor_auth在auth::two_factorrequire_two_factor_auth = false但是,尽管在所有这四个地方都设置了相同的属性,这是非常不寻常的。如果属性的正确值确实取决于配方,角色和环境,则通常所得到的值结合了这三个特性,并且在每个级别上都设置了不同的属性,并在配方中进行了组合。
如果这不起作用,则两种可能性是:
chef-client -o "recipe[nginx]"代替chef-client -o role[web_server]或替换运行清单chef-client如果不是这种情况,请提供更多详细信息。我一直在使用它,并且一直有效,并且我担心是否有一些极端情况,其行为与所记录的不一样。