web-dev-qa-db-fra.com

Chef: Comment remplacer les attributs par défaut dans les rôles?

J'utilise l'opscode livre de cuisine nginx pour configurer le serveur nginx sur mes nœuds. Le livre de recettes nginx a des attributs par défaut que j'aimerais remplacer dans mon rôle ("web_server").

Ce sont les attributs que j'aimerais remplacer:

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 mon fichier roles/web_server.rb, 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 remplacements et utilise ceux par défaut.

Qu'est-ce que je fais mal ici?

Merci!

24
Milan Novota

Selon le document Chef Attribute Preference , 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 devez pas utiliser override_attributes dans les rôles . Une fois que vous commencez à utiliser des remplacements au lieu des valeurs par défaut, vous finirez rapidement par découvrir que vous avez utilisé le remplacement le plus fort possible et que vous n'avez plus d'autre moyen de le remplacer. Utilisation default_overrides au lieu.

Les règles de priorité autour des attributs, utilisant uniquement le niveau default sont en fait assez identiques:

  1. S'il y en a un, l'attribut du rôle est utilisé, par exemple require_two_factor_auth est forcé à true avec default_overrides dans role[single_sign_on], même en QA
  2. S'il y en a un, l'attribut de l'environnement est utilisé, par exemple require_two_factor_auth est forcé à true dans production
  3. S'il y en a un, l'attribut de la recette est utilisé, par exemple require_two_factor_auth est défini sur true dans auth::two_factor
  4. Enfin, l'attribut sain par défaut du fichier d'attributs par défaut est utilisé, par exemple, require_two_factor_auth = false

Cependant, il est extrêmement inhabituel que le même attribut soit défini 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 la valeur résultante combine généralement les caractéristiques des trois, et un attribut différent est défini à chaque niveau et combiné dans la recette.


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

  • Rôle modifié non téléchargé sur le serveur
  • Remplacement de la liste d'exécution avec chef-client -o "recipe[nginx]" au lieu de chef-client -o role[web_server] ou simple chef-client

Si ce n'est pas le cas, veuillez fournir plus de détails. J'utilise cela tout le temps et cela a toujours fonctionné, et je serais inquiet s'il y avait des cas Edge où cela ne se comportait pas comme documenté.

5
andrewdotn

Le tableau de priorité des attributs [1] montre que ces quatre options se classent 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 cela ne semble pas être la cause, alors peut-être que changer votre formatage pourrait vous aider. Je l'écrirais 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
Dan

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

Assurez-vous qu'aucun attribut n'est remplacé sur un nœud directement dans votre recette.

1
Igor Pavelek

Vous pouvez également utiliser des attributs de remplacement dans l'éditeur de rôle (dans l'édition de rôle Web ou 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
riverfall

Le seul problème que je pouvais deviner est que ces attributs devaient avoir été remplacés par l'attribut force_overridden. Assurez-vous également que les attributs que vous avez remplacés sont disponibles pour la liste d'exécution (car je suis sceptique quant à la façon dont vous avez organisé votre fichier de rôle)

1
Agalya Loganathan

Avez-vous essayé entre parenthèses? J'ai essayé votre exemple avec des parenthèses et j'ai remplacé les attributs par défaut.

# 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