ノードでnginxサーバーを構成するためにopscode nginx cookbook を使用しています。 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
私のroles/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レシピは私のオーバーライドを無視し、デフォルトのオーバーライドを使用します。
ここで何が悪いのですか?
ありがとう!
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
レベルのみを使用する属性に関する優先順位ルールは、実際にはかなり同じです。
require_two_factor_auth
はdefault_overrides
でrole[single_sign_on]
を使用してtrueに強制されます。QAでもproduction
ではrequire_two_factor_auth
がtrueに強制されますrequire_two_factor_auth
でauth::two_factor
がtrueに設定されますrequire_two_factor_auth = false
ただし、これらの4つの場所すべてに同じ属性が設定されることは非常にまれです。属性の正しい値が実際にレシピと役割および環境に依存している場合、通常、結果の値は3つすべての機能を組み合わせ、各レベルで異なる属性が設定され、レシピで組み合わせられます。
これが機能しない場合、2つの可能性があります。
chef-client -o "recipe[nginx]"
またはプレーンchef-client -o role[web_server]
ではなくchef-client
でオーバーライドするそうでない場合は、詳細をお知らせください。私はこれを常に使用しており、常に機能しており、これが文書化されたとおりに動作しないEdgeのケースがあったかどうか心配です。
属性優先チャート[1]は、これらの4つのオプションが役割より上位にあることを示しています。
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
ここで属性の優先順位を確認しましたか? https://docs.chef.io/attributes.html#attribute-precedence
レシピ内のノードで直接オーバーライドされている属性がないことを確認してください。
ロールエディター(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": {
}
}
私が推測できる唯一の問題は、これらの属性がforce_overridden属性によってオーバーライドされている必要があることです。また、上書きした属性がランリストで使用できることを確認してください(ロールファイルの配置方法に懐疑的であるため)
括弧で試しましたか?括弧であなたの例を試してみて、デフォルトの属性を上書きしました。
# your roles/web_server.rb file
override_attributes(
'nginx' => {
'install_method' => "source",
'version' => "1.2.3",
'source' => { "prefix" => "/opt/nginx", "checksum" => nil }
}
)