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!
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:
require_two_factor_auth
est forcé à true avec default_overrides
dans role[single_sign_on]
, même en QArequire_two_factor_auth
est forcé à true dans production
require_two_factor_auth
est défini sur true dans auth::two_factor
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:
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é.
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
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.
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": {
}
}
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)
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 }
}
)