Подтвердить что ты не робот

Шеф-повар: Как переопределить атрибуты по умолчанию в ролях?

Я использую opscode nginx cookbook для настройки сервера 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 игнорирует мои переопределения и использует значения по умолчанию.

Что я здесь делаю неправильно?

Спасибо!

4b9b3361

Ответ 1

Диаграмма приоритета атрибута [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

Ответ 2

В соответствии с Предпочтение атрибута шеф-повара, это должно работать:

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, на самом деле очень похожи:

  • Если он есть, используется атрибут из роли, например, require_two_factor_auth принудительно применяется к true с default_overrides в role[single_sign_on], даже в QA
  • Если он есть, используется атрибут из среды, например, require_two_factor_auth принудительно имеет значение true в production
  • Если он есть, используется атрибут из рецепта, например, require_two_factor_auth установлено значение true в auth::two_factor
  • Наконец, используется нормальный атрибут по умолчанию из файла атрибута по умолчанию, например, require_two_factor_auth = false

Однако его чрезвычайно необычный для того же атрибута, который будет установлен во всех четырех из этих мест. Если правильное значение атрибута действительно зависит от рецепта, роли и среды, тогда обычно результирующее значение объединяет функции всех трех, а другой атрибут устанавливается на каждом уровне и объединяется в рецепт.


Если это не работает, возможны две возможности:

  • Отредактированная роль, не загруженная на сервер
  • Переопределение списка запуска с помощью chef-client -o "recipe[nginx]" вместо chef-client -o role[web_server] или простого chef-client

Если это не так, пожалуйста, предоставьте более подробную информацию. Я использую это все время и всегда работаю, и Id заботится о том, были ли случаи с краем, когда это не ведет себя как задокументированное.

Ответ 3

Вы проверили порядок приоритета атрибута здесь? https://docs.chef.io/attributes.html#attribute-precedence

Убедитесь, что в вашем рецепте нет атрибутов, переопределенных на node.

Ответ 4

Единственная проблема, которую я мог догадаться, состоит в том, что эти атрибуты должны были быть преодолены force_overridden. Также убедитесь, что атрибуты, которые вы переопределили, доступны для списка (поскольку я скептически отношусь к тому, как вы упорядочили свой файл роли)

Ответ 5

Вы также можете использовать атрибуты переопределения в редакторе ролей (в роли редактирования роли в Интернете или ноже)

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

  }
}

Ответ 6

Вы пробовали с круглыми скобками? Я попробовал ваш пример с круглыми скобками и получил переопределенные атрибуты по умолчанию.

# your roles/web_server.rb file

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