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!
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
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:
- Si il y en a un, l'attribut du rôle, par exemple,
require_two_factor_auth
est forcé à true avecdefault_overrides
role[single_sign_on]
, même en QA - Si il y en a un, l'attribut de l'environnement est utilisé, par exemple,
require_two_factor_auth
est forcé à true enproduction
- Si il y en a un, l'attribut de la recette est utilisé, par exemple,
require_two_factor_auth
est défini à true dansauth::two_factor
- 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 dechef-client -o role[web_server]
ou brutchef-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é.
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)
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.
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": {
}
}
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 }
}
)