2012-08-27 5 views
23

Ich verwende den Opscode nginx cookbook zum Konfigurieren des Nginx-Servers auf meinen Knoten. Das nginx Kochbuch hat einige Standardattribute, die ich in meiner Rolle überschreiben möchte ("web_server").Chef: Wie überschreibe ich Standardattribute in Rollen?

Das sind die Attribute Ich mag würde außer Kraft zu setzen:

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 

In meinen Rollen/web_server.rb Datei, die ich so etwas wie diese:

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

Wenn jedoch die Chef- laufen Client Das Nginx-Rezept ignoriert meine Überschreibungen und verwendet die Standardeinstellungen.

Was mache ich hier falsch?

Danke!

+0

Haben Sie vergessen, Rolle auf Chef-Server hochzuladen (wenn Sie es verwenden)? –

+6

Führen Sie einen Chef-Client mit oder ohne eine benutzerdefinierte Ausführungsliste (-o) aus? Heute habe ich gelernt (nach 2-3 Stunden Debugging), dass Attribute, die in der Rolle/dem Knoten gesetzt sind, nicht verwendet werden, wenn die Laufliste überschrieben wird. –

+2

Ich habe das gleiche Problem festgestellt:/Ich bin mir ziemlich sicher, dass ich override_attributes in der Rolle gesetzt habe, und ich verwende nur den Standard in meiner Attributdatei. Ich wette, das ist eine Art Kochwanze oder was? –

Antwort

1

Das einzige Problem, das ich erraten konnte, ist, dass diese Attribute von force_overridden Attribut übergangen worden sein müssen. Stellen Sie außerdem sicher, dass die Attribute, die Sie überschrieben haben, für die Runlist verfügbar sind (da ich skeptisch bin, wie Sie Ihre Rollendatei angeordnet haben)

0

Haben Sie es mit Klammern versucht? Ich habe Ihr Beispiel mit Klammern getestet und die Standardattribute überschrieben.

# your roles/web_server.rb file 

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

Das Attribut Vorrang Diagramm [1] zeigt, dass diese vier Optionen über Ihre Rolle Rang:

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 

Wenn dies nicht die Ursache zu sein scheinen, dann vielleicht, wenn Sie Ihre Formatierung helfen könnte. Ich würde schreiben Sie es mögen:

override_attributes(
    nginx: { 
    install_method: 'source', 
    version: '1.2.3', 
    source: { 
     prefix: '/opt/nginx', 
     checksum: [ ], 
    }, 
    } 
) 

[1] https://docs.chef.io/attributes.html#attribute-precedence

1

Sie auch überschreiben Attribute in Rolle-Editor (in Web- oder Messer Rolle bearbeiten)

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

    } 
} 
3

Nach dem Chef Attribute Preference Dokument verwenden können dies sollte funktionieren:

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

Sie sh override_attributes in den Rollen nicht verwenden. Sobald Sie beginnen, Überschreibungen anstelle von Standardwerten zu verwenden, werden Sie schnell feststellen, dass Sie die stärkste mögliche Überschreibung verwendet haben und keine weitere Möglichkeit haben, diese außer Kraft zu setzen. Verwenden Sie stattdessen default_overrides.

Die Vorrangregeln Attribute um, sind nur die default Ebene mit eigentlich ziemlich gleich:

  1. Wenn es einen gibt, wird das Attribut von der Rolle, z.B.Wird require_two_factor_auth auf true mit default_overrides in role[single_sign_on], auch in QA gezwungen
  2. Wenn es eines gibt, das Attribut aus der Umgebung verwendet wird, zB wird require_two_factor_auth in production
  3. auf true gezwungen
  4. Wenn es ein, das Attribut aus das Rezept verwendet wird, zB wird require_two_factor_auth in auth::two_factor auf true gesetzt
  5. Schließlich ist das vernünftige Standardattribut aus der Standard-Attributdatei verwendet wird, zB require_two_factor_auth = false

es jedoch für th äußerst ungewöhnlich Das gleiche Attribut muss jedoch an allen vier Stellen gesetzt werden. Wenn der korrekte Wert des Attributs wirklich von dem Rezept und der Rolle und der Umgebung abhängt, kombiniert der resultierende Wert normalerweise die Merkmale aller drei Elemente, und auf jeder Ebene wird ein anderes Attribut festgelegt und im Rezept kombiniert.


Wenn dies nicht funktioniert, zwei Möglichkeiten:

  • Edited Rolle nicht auf den Server hochgeladen
  • Zwingende Laufliste mit chef-client -o "recipe[nginx]" statt chef-client -o role[web_server] oder schlicht chef-client

Wenn das nicht der Fall ist, geben Sie bitte weitere Einzelheiten an. Ich benutze es die ganze Zeit und es hat immer funktioniert, und ich wäre besorgt, wenn es Kantenfälle gäbe, wo dies sich nicht wie dokumentiert verhält.