2012-08-27 12 views
23

Sto usando l'opcode nginx cookbook per configurare il server nginx sui miei nodi. Il libro di cucina nginx ha alcuni attributi predefiniti che vorrei sovrascrivere nel mio ruolo ("web_server").Chef: come sovrascrivere gli attributi predefiniti nei ruoli?

Questi sono gli attributi che vorrei ignorare:

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 

Nei miei ruoli/lima web_server.rb ho qualcosa di simile:

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

Tuttavia, quando si esegue la chef- client la ricetta nginx ignora i miei override e usa quelli predefiniti.

Cosa sto facendo di sbagliato qui?

Grazie!

+0

Non hai dimenticato di caricare il ruolo su chef-server (se lo stai utilizzando)? –

+6

Stai utilizzando lo chef-cliente con o senza un elenco di esecuzione personalizzato (-o)? Oggi ho imparato (dopo 2-3 ore di debug) che gli attributi impostati nel ruolo/nodo non vengono utilizzati quando si esegue l'override della lista di esecuzione. –

+2

Ho riscontrato lo stesso problema:/Sono abbastanza sicuro di aver impostato override_attributes nel ruolo, e uso solo il default nel mio file degli attributi. Scommetto che questa è una specie di bug dello chef o cosa. –

risposta

1

L'unico problema che posso indovinare è che questi attributi devono essere stati sovrascritti dall'attributo force_overridden . Assicurati anche che gli attributi che hai sovrascritto siano disponibili per la lista (dal momento che sono scettico sul modo in cui hai organizzato il tuo file di ruolo)

0

Hai provato con parentesi? Ho provato il tuo esempio con parentesi e ho ottenuto gli attributi di default sovrascritti.

# your roles/web_server.rb file 

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

Il grafico attributo la precedenza [1] dimostra che queste quattro opzioni rango sopra il vostro ruolo:

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 

Se questi non sembrano essere la causa, allora forse cambiare la formattazione potrebbe aiutare. Vorrei scrivere le cose come:

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

È inoltre possibile utilizzare prevalgono sugli attributi in editor di ruolo (in web o ruolo coltello modificare)

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

Secondo il documento Chef Attribute Preference , questo dovrebbe funzionare:

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

Si non utilizzare override_attributes nei ruoli. Una volta che inizi a utilizzare le sostituzioni anziché i valori predefiniti, ti ritroverai rapidamente a trovare il modo più efficace possibile di sostituirlo e non hai più modo di sostituirlo. Utilizzare invece default_overrides.

Le regole di precedenza intorno attributi, utilizzando solo il livello default sono in realtà piuttosto stesso:

  1. Se esiste, l'attributo dal ruolo viene utilizzata, ad esempio, require_two_factor_auth è costretto a vero con default_overrides in role[single_sign_on], anche in QA
  2. Se esiste, l'attributo dall'ambiente viene utilizzata, ad esempio, require_two_factor_auth è costretto a true in production
  3. Se esiste, l'attributo dal la ricetta è utilizzato, ad esempio, require_two_factor_auth è impostato a true in auth::two_factor
  4. Infine, l'attributo di default sano di mente dal file attributo predefinito viene utilizzato, ad esempio, require_two_factor_auth = false

Tuttavia, è estremamente insolito per th Lo stesso attributo deve essere impostato in tutti e quattro questi posti, però. Se il valore corretto dell'attributo dipende in realtà dalla ricetta e dal ruolo e dall'ambiente, di solito il valore risultante combina le caratteristiche di tutti e tre, e un attributo diverso viene impostato ad ogni livello e combinato nella ricetta.


Se questo non funziona, due possibilità sono:

  • ruolo modificati non caricati sul server
  • Overriding elenco di esecuzione con chef-client -o "recipe[nginx]" invece di chef-client -o role[web_server] o semplice chef-client

Se questo non è il caso, si prega di fornire maggiori dettagli. Lo uso sempre e funziona sempre, e sarei preoccupato se ci fossero casi limite in cui questo non si comporta come documentato.

Problemi correlati