web-dev-qa-db-fra.com

Méthode recommandée pour définir des attributs de nœud Chef uniques

J'essaie d'utiliser Chef pour gérer de nouvelles machines virtuelles. J'utilise un serveur Chef dédié et effectue tout ce travail à partir d'un poste de travail distinct vm.

Actuellement, je clone une image vm de base, puis j'utilise un couteau bootstrap pour installer Chef et ramener la vm à un état cohérent. 

Je peux spécifier un environnement ou une liste d’exécution pour la machine virtuelle; Je peux remplacer certains paramètres de mon environnement, par exemple. J'ai le chef-client intervalle dans le bloc "substitutions" de l'environnement de test configuré pour exécuter le client toutes les 60 secondes pendant les tests, de sorte que je n'ai pas à exécuter manuellement chef-client à chaque fois.

Par exemple, mon flux de travail est le suivant:

  • clone template vm et démarrez vm

  • définissez le nom d'hôte manuellement (mettez à jour/etc/hostname et/etc/hosts) et redémarrez

  • Bootstrap le noeud avec les recettes initiales

    couteau bootstrap chef-test1 -r 'recette [ntp], recette [chef-client]'

  • éditez le noeud pour refléter le nouvel environnement

Le problème que je rencontre est la définition des attributs par nœud. J'aimerais utiliser le hostname cookbook pour définir le nom d'hôte du nœud. Si je le configure dans un rôle, chaque serveur devra alors créer un nouveau rôle. Mais lorsque j'essaie d'initialiser et d'inclure ce rôle, une erreur se produit:

chef-test1   * log[Please set the set_fqdn attribute to desired hostname] action write[2013-12-09T16:26:56-07:00] WARN: Please set the set_fqdn attribute to desired hostname

Lorsque j'amorce sans cette recette et que j'essaie de modifier le nœud et de définir l'attribut "set_fqdn", je ne peux pas enregistrer l'attribut, par exemple. ce json:

{
  "name": "chef-test1",
  "set_fqdn": "chef-test1.local.fqdn",
  "chef_environment": "test-dev1",
  "normal": {
    "tags": [

    ]
  },
  "run_list": [
    "recipe[ntp]",
    "recipe[chef-client]",
    "recipe[hostname]"
  ]
}

quand je sors de mon éditeur, un couteau me dit:

Node not updated, skipping node save

J'ai tenté de modifier cet attribut dans l'interface graphique du chef et cet attribut ne sera pas enregistré.

J'ai trouvé ce type qui est en train de créer le fichier json dans /etc/chef/chef.json, faisant ce que je pensais, mais je ne sais pas comment /etc/chef/chef.json entre en jeu. (mise à jour pour chaque nouveau nœud? Je n'utilise pas chef-solo alors c'est peut-être là que je ne comprends plus).

Selon ce fil de discussion il n’est pas possible de remplacer les attributs par défaut avec le nœud de couteau, mais "set_fqdn" n’est pas un défaut. J'aimerais éviter de créer un rôle pour chaque nœud et je pense que je peux utiliser le livre de noms d'hôte pour réduire le besoin de définir manuellement le nom d'hôte, comme par exemple:

couteau bootstrap saucy64 -r 'recette [ntp], recette [chef-client], recette [nom hôte]' --json '"{set_fqdn": "chef-test1.local.tld", "chef_client": {"interval" : "600"} '

couteau bootstrap Fedora19 -r 'recette [ntp], recette [chef-client], recette [nom hôte]' --json '"{set_fqdn": "chef-test2.local.tld", "chef_client": {"interval" : "60"} '

J'apprécie l'aide.

11
user1106405

Je vois des problèmes:

  • pendant knife node edit, vous ne pouvez pas définir l'attribut en tant qu'attribut de niveau supérieur à côté de fqdn, etc. Vous devez le placer sous normal. C'est la hiérarchie entre default et override. Voir Priorité d'attribut
  • en utilisant knife node edit odeurs. Je préférerais ne pas le faire (cela pourrait aller pour le nom d'hôte, mais pour tout le reste, il est impossible de suivre de tels changements dans le contrôle de version). Essayez d’exécuter le livre de recettes hostname.
  • écrire des attributs dans un fichier chef.json devrait être évité, à mon humble avis. Votre logique devrait être à l'intérieur de vos livres de cuisine
  • vous devriez avoir un rôle/livre de recettes base ou similaire qui inclut les éléments triviaux de chaque nœud (comme ntp, chef-client et également le nom d'hôte).
  • vous pouvez aussi définir l'environnement directement pendant bootstrapping : -E myenv (mais oui, je me demande pourquoi cela n'est pas documenté)
  • vous pouvez également définir le nom du nœud pendant l’amorçage: -N NAME ou --node-name NAME.
6
StephenKing

que diriez-vous d’une recette qui définit le nom d’hôte en fonction du nom de noeud défini lorsque vous amorcez le noeud, I en a écrit un qui est un fork du livre de recettes original chef-hostname.

2
user1106405

Cela marche:

knife bootstrap 192.168.15.43 -r 'recipe[hostname],recipe[ntp],recipe[chef-client]' -j '{"set_fqdn": "chef-test2"}'

(également trouvé en train de lire knife help bootstrap help)

Cette réponse de stackoverflow utilise une syntaxe similaire.

Edit: Eh bien, presque, cela crée deux entrées de nœud. besoin de spécifier le nom du noeud avec le paramètre -N:

knife bootstrap 192.168.15.43 -r 'recipe[hostname],recipe[ntp],recipe[chef-client]' -j '{"set_fqdn": "chef-test2"}' -N chef-test2

knife bootstrap 192.168.15.43 --run-list 'recipe[hostname],recipe[ntp],recipe[chef-client]' --json-attributes '{"set_fqdn": "chef-test2"}' --node-name chef-test2
0
user1106405