25

我正在使用 opscode nginx 食谱在我的节点上配置 nginx 服务器。nginx 食谱有一些我想在我的角色中覆盖的默认属性(“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-client 时,nginx 配方会忽略我的覆盖并使用默认值。

我在这里做错了什么?

谢谢!

4

7 回答 7

6

根据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 }
}

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

仅使用级别的属性优先规则default实际上是相同的:

  1. 如果有,则使用来自角色的属性,例如,在 in 中require_two_factor_auth强制为真,即使在 QA中也是如此default_overridesrole[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

如果不是这种情况,请提供更多详细信息。我一直都在使用它,它总是有效的,如果有边缘情况不符合记录的情况,我会担心。

于 2016-08-26T17:44:46.940 回答
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

于 2014-02-12T18:25:41.057 回答
2

这个问题来自2012年,非常非常古老。我的第一个建议是更明确地创建哈希参数,优先级应该设置为默认值,永远不要覆盖:

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 }
  }
})

该问题可能与nginx 食谱中使用的派生属性有关:

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

如果在解析第二行时先前解析的配置未设置更高级别的覆盖,它将立即选择第一行。因为至少 Chef 11 角色属性总是胜过属性文件中的默认属性。甚至早在 Chef 10 中,覆盖角色属性也应该已经被解析,并且应该超过此处第一行中的默认设置。我不知道为什么 override 属性在 2012 年对该用户不起作用。这可能与 Chef 11.x 版本中围绕生成所有优先级的合并视图的简单错误有关(错误早已修复,但我无法再回忆细节)。

我鼓励当前阅读此问题的任何人使用 PolicyFiles,它替换角色、环境和 Berkshelf 文件。所有后者仍然受到支持,但没有进一步的发展。

于 2020-08-21T02:03:32.780 回答
1

我能猜到的唯一问题是这些属性必须被 force_overridden 属性覆盖。还要确保您覆盖的属性可用于运行列表(因为我对您安排角色文件的方式持怀疑态度)

于 2013-09-22T14:43:43.940 回答
1

您是否在此处检查了属性优先顺序?https://docs.chef.io/attributes.html#attribute-precedence

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

于 2012-08-27T15:18:13.503 回答
1

您还可以在角色编辑器中使用覆盖属性(在 web 或刀角色编辑中)

{
  "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": {

  }
}
于 2016-02-16T13:18:25.383 回答
0

你试过括号吗?我用括号尝试了您的示例,并覆盖了默认属性。

# your roles/web_server.rb file

override_attributes(
  'nginx' => {
    'install_method' => "source",
    'version' => "1.2.3",
    'source' => { "prefix" => "/opt/nginx", "checksum" => nil }
  }
)
于 2013-10-30T11:20:59.683 回答