Шеф-повар: Как переопределить атрибуты по умолчанию в ролях?
Я использую 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 игнорирует мои переопределения и использует значения по умолчанию.
Что я здесь делаю неправильно?
Спасибо!
Ответы
Ответ 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 }
}
)