Chef: Comment puis-je outrepasser les attributs par défaut dans les rôles?

j'utilise l'opscode nginx livre de cuisine pour configurer le serveur nginx sur mes noeuds. Le cookbook nginx a quelques attributs par défaut que je voudrais outrepasser dans mon rôle ("web_server").

Voici les attributs que j'aimerais annuler:

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

Dans mes rôles/web_server.rb fichier j'ai quelque chose comme ceci:

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

cependant, lors de l'exécution du chef-client la recette nginx ignore mes dérogations et utilise la valeur par défaut .

Ce que je fais mal?

Merci!

24
demandé sur Milan Novota 2012-08-27 19:04:12

6 réponses

le tableau des attributs de priorité [1] montre que ces quatre options se situent au-dessus de votre rôle:

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

si ceux-ci ne semblent pas être la cause, alors peut-être changer votre formatage pourrait aider. Je voudrais écrire comme:

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
répondu Dan 2016-01-11 23:19:59

Selon Chef Attribut Preference document, cela devrait fonctionner:

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

Vous ne devriez pas utiliser override_attributes dans les rôles. Une fois que vous commencez à utiliser des overrides au lieu de par défaut, vous finirez rapidement par trouver que vous avez utilisé le plus fort possible override et n'avez aucun autre moyen de le faire. Utilisez default_overrides à la place.

les règles de préséance autour des attributs, en utilisant seulement le default niveau sont en fait assez même:

  1. Si il y en a un, l'attribut du rôle, par exemple, require_two_factor_auth est forcé à true avec default_overridesrole[single_sign_on], même en QA
  2. Si il y en a un, l'attribut de l'environnement est utilisé, par exemple, require_two_factor_auth est forcé à true en production
  3. Si il y en a un, l'attribut de la recette est utilisé, par exemple, require_two_factor_auth est défini à true dans auth::two_factor
  4. enfin, l'attribut sane default du fichier d'attribut default est utilisé, par exemple, require_two_factor_auth = false

cependant, il est extrêmement rare que le même attribut soit placé dans ces quatre endroits. Si la valeur correcte de l'attribut dépend vraiment de la recette et du rôle et de l'environnement, alors généralement la valeur résultante combine les caractéristiques des trois, et un attribut différent est mis à chaque niveau et combiné dans la recette.


Si cela ne fonctionne pas, deux possibilités sont:

  • Édité rôle non téléchargés sur le serveur
  • outrepasser la liste des run avec chef-client -o "recipe[nginx]" au lieu de chef-client -o role[web_server] ou brut chef-client

Si ce n'est pas le cas, veuillez fournir plus de détails. J'utilise ça tout le temps et ça a toujours marché, et je serais inquiet s'il y avait des cas extrêmes où ça ne se comporte pas comme documenté.

3
répondu andrewdotn 2016-08-26 17:44:46

le seul problème que je pourrais deviner est que ces attributs doivent avoir été over-ridden par attribut force_overridden. Assurez-vous également que les attributs que vous avez over-ridden sont disponibles pour la liste d'exécution(puisque je suis sceptique sur la façon dont vous avez arrangé votre fichier de rôle)

1
répondu Agalya Loganathan 2013-09-22 14:43:43

avez-vous vérifié l'ordre de priorité des attributs ici? https://docs.chef.io/attributes.html#attribute-precedence

assurez-vous qu'aucun des attributs remplacée sur un nœud directement dans votre recette.

1
répondu Igor Pavelek 2016-01-11 23:20:23

Vous pouvez également utiliser les attributs override dans l'éditeur de rôle (dans l'édition de rôle de web ou de couteau)

{
  "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
répondu riverfall 2016-02-16 13:18:25

avez-vous essayé les parenthèses? J'ai essayé votre exemple avec des parenthèses et j'ai obtenu les attributs par défaut annulés.

# your roles/web_server.rb file

override_attributes(
  'nginx' => {
    'install_method' => "source",
    'version' => "1.2.3",
    'source' => { "prefix" => "/opt/nginx", "checksum" => nil }
  }
)
0
répondu Tung Nguyen 2013-10-30 11:20:59