Question Existe-t-il un moyen de transmettre des paramètres au moment de l'exécution dans Chef?


Je voulais passer quelques attributs à chef-client à l'exécution. Y a-t-il un moyen de faire la même chose? Je cherchais chef-client -j option, mais à ma connaissance, il peut être utilisé pour spécifier run_list. Puis-je y transmettre des attributs? Si oui comment?


6
2018-02-19 08:58


origine




Réponses:


Oui, vous pouvez utiliser le -j Option de fichier json pour renseigner les attributs de nœud.

{
  "my_attribute": "I like attributes!"
}

Cela fera un attribut nommé my_attribute disponible dans vos livres de cuisine. Par exemple,

Chef::Log.info(node['my_attribute'])

Ou,

if node['my_attribute'] =~ /like/
  package "foo-likes-attributes" do
    action :install
  end
end

Définir une liste d’exécution initiale est l’utilisation la plus courante du fichier d’attributs json pour Chef Client. Toutefois, si vous utilisez Chef Client + Chef Server, vous pouvez simplement modifier l’objet noeud sur le serveur, soit via l’interface Web (Open Source Chef Server), la console de gestion (Opscode Hosted / Private Chef), ou knife node edit Si vous utilisez l'outil de ligne de commande, couteau.

Notez que l’utilisation du fichier JSON revient à modifier l’objet noeud sur le serveur, les attributs définis ici comme priorité "normale" comme lorsqu’ils sont utilisés dans une recette, et ces valeurs d’attributs seront enregistrées dans l’objet Nœud du serveur à la fin. d'une course réussie.


9
2018-02-19 16:07



Merci pour la réponse. Puis-je les utiliser en quelque sorte dans mon fichier d'attributs? Mon cas d'utilisation exact est le suivant: je souhaite exécuter un service sur un port spécifique pour un nœud spécifique et je souhaite le fournir au moment de l'exécution (chef-client -j). - - Manak Wadhwa
Vous pouvez absolument définir des attributs dans le fichier d'attributs d'un livre de recettes. - jtimberman


Le moyen idéal d'utiliser les attributs est de les écrire dans votre livre de recettes ou dans un sachet de données. Voici les emplacements de fichiers pour:

Disposition du répertoire Chef Repo

|- chef-repo
|---- cookbooks
|------- attributes
|---------- default.rb
|------- recipes
|---------- default.rb
|---- data_bags
|------- users
|---------- john.json
|---------- susan.json
|------- databases
|----------- master.json
|----------- slave.json

Vous pouvez stocker des données dans vos fichiers de sac de données au format JSON de base ( knife create data_bag users).

Créez un sac de données utilisateur pour john:

$ knife data bag create users john

{
  "id" : "john"
  "age" : "27"
  "height" : "60in"
}

Utiliser des sacs de données

Si vous choisissez d'utiliser des sacs de données (je les recommande si vous avez beaucoup d'utilisateurs ou de serveurs de base de données différents (dans ce contexte)), vous pouvez afficher plus d'informations à l'adresse suivante: https://docs.getchef.com/dsl_recipe_method_data_bag.html. En outre, il est plus facile de créer un users répertoire dans votre répertoire data_bags et créez les fichiers utilisateur .json (~ / chef-repo / data_bags / users / john.json) avec le contenu ci-dessus, puis chargez le sachet de données sur le serveur du chef: knife data bag from file users /path/to/data_bags/users/john.json

Utilisation d'attributs

Vous pouvez également stocker les données dans votre fichier d'attributs:

fichier d'attributs

$ vi ~/chef-repo/cookbooks/my-cookbook-name/attributes/default.rb

default['my-cookbook-name']['user-1'] = "John"
default['my-cookbook-name']['user-1']['age'] = "27"
default['my-cookbook-name']['user-1']['height'] = "60in"

recette de livre de cuisine

$ vi ~/chef-repo/cookbooks/my-cookbook-name/default.rb

template "/root/user-list" do
  action :create
  source "user-list.erb"
end

user-list.erb

$ vi ~/chef-repo/cookbooks/my-cookbook-name/templates/default/user-list.erb

<html>
<head>
 <title>My User List</title>
</head>
<body>
<h1>User List</h1>
User 1: <%= node['my-cookbook-name']['user-1'] %>
User Age: <%= node['my-cookbook-name']['user-1']['age'] %>
User Height: <%= node['my-cookbook-name']['user-1']['height'] %>
</body> 
</html>

1
2017-10-04 14:01





vous pouvez le faire sur la ligne de commande, mais - surtout dans une série de coups de couteau - il va commencer à avoir l'air vraiment bizarre:

chef-client \
  -o vmware-tools \
  --force-formatter \
  -j '<(echo {\"vmware-tools\":{\"style\":\"rpm\"}})'

Mais ici nous mettons à profit -j et un <(notation) pour créer le fichier JSON à la volée, sous forme d'artefacts jeté au couteau (ou ssh-i, ici). Si vous devez le faire, le risque est que les délimiteurs en conflit vous rendent fous à peu près au moment où vous le faites fonctionner.


1
2018-04-25 17:23