web-dev-qa-db-ja.com

シェフ:ロールのデフォルト属性をオーバーライドするにはどうすればよいですか?

ノードで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レシピは私のオーバーライドを無視し、デフォルトのオーバーライドを使用します。

ここで何が悪いのですか?

ありがとう!

24
Milan Novota

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. 存在する場合、ロールの属性が使用されます。たとえば、require_two_factor_authdefault_overridesrole[single_sign_on]を使用してtrueに強制されます。QAでも
  2. 存在する場合、環境の属性が使用されます。たとえば、productionではrequire_two_factor_authがtrueに強制されます
  3. 存在する場合、レシピの属性が使用されます。たとえば、require_two_factor_authauth::two_factorがtrueに設定されます
  4. 最後に、デフォルト属性ファイルからの適切なデフォルト属性が使用されます。例:require_two_factor_auth = false

ただし、これらの4つの場所すべてに同じ属性が設定されることは非常にまれです。属性の正しい値が実際にレシピと役割および環境に依存している場合、通常、結果の値は3つすべての機能を組み合わせ、各レベルで異なる属性が設定され、レシピで組み合わせられます。


これが機能しない場合、2つの可能性があります。

  • 編集されたロールがサーバーにアップロードされていません
  • 実行リストをchef-client -o "recipe[nginx]"またはプレーンchef-client -o role[web_server]ではなくchef-clientでオーバーライドする

そうでない場合は、詳細をお知らせください。私はこれを常に使用しており、常に機能しており、これが文書化されたとおりに動作しないEdgeのケースがあったかどうか心配です。

5
andrewdotn

属性優先チャート[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

4
Dan

ここで属性の優先順位を確認しましたか? https://docs.chef.io/attributes.html#attribute-precedence

レシピ内のノードで直接オーバーライドされている属性がないことを確認してください。

1
Igor Pavelek

ロールエディター(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": {

  }
}
1
riverfall

私が推測できる唯一の問題は、これらの属性がforce_overridden属性によってオーバーライドされている必要があることです。また、上書きした属性がランリストで使用できることを確認してください(ロールファイルの配置方法に懐疑的であるため)

1

括弧で試しましたか?括弧であなたの例を試してみて、デフォルトの属性を上書きしました。

# your roles/web_server.rb file

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