Chef:如何覆盖角色中的默认属性?

Mil*_*ota 24 chef-infra

我正在使用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配方会忽略我的覆盖并使用默认值.

我在这做错了什么?

谢谢!

and*_*otn 5

根据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实际上,仅使用级别的属性优先级规则几乎相同:

  1. 如果有一个,则使用角色的属性,例如,即使在QA 中,也require_two_factor_auth必须使用default_overridesin 强制将其设置为truerole[single_sign_on]
  2. 如果存在,则使用来自环境的属性,例如,require_two_factor_authproduction
  3. 如果有一个,则使用配方中的属性,例如,require_two_factor_authauth::two_factor
  4. 最后,使用默认属性文件中的健全默认属性,例如, require_two_factor_auth = false

但是,尽管在所有这四个地方都设置了相同的属性,这是非常不寻常的。如果属性的正确值确实取决于配方,角色和环境,则通常所得到的值结合了这三个特性,并且在每个级别上都设置了不同的属性,并在配方中进行了组合。


如果这不起作用,则两种可能性是:

  • 编辑的角色未上传到服务器
  • chef-client -o "recipe[nginx]"代替chef-client -o role[web_server]或替换运行清单chef-client

如果不是这种情况,请提供更多详细信息。我一直在使用它,并且一直有效,并且我担心是否有一些极端情况,其行为与所记录的不一样。


Igo*_*lek 1

您检查过这里的属性优先顺序吗?https://docs.chef.io/attributes.html#attribute-precedence

确保配方中的节点上没有直接覆盖的属性。