Question Pourquoi le chef ne peut-il pas résoudre mes livres de cuisine?


Introduction J'apprends Chef pour automatiser la gestion du serveur au travail. J'ai téléchargé chefdk 3.0 à partir de ici et maintenant j'essaye de construire mon premier livre de cuisine en utilisant le chef.

Important Je l'utilise dans un environnement Windows à des fins de test, je m'attends à ce qu'il échoue car Windows n'a pas iptables, mais je ne m'attends pas à ce qu'il échoue en disant qu'il ne peut pas trouver le livre de recettes. J'ai essayé d'utiliser Livre de recettes Windows et il fonctionne.

Le problème Je suis capable de créer le livre de recettes et de l'exécuter, mais je ne suis pas en mesure de faire référence aux dépendances du supermarché.

J'ai essayé deux alternatives:

Alternative 1

J'ai utilisé la commande suivante pour créer le livre de recettes

chef generate cookbook learn_chef_httpd

(de ce tutoriel)

J'ai pu terminer le tutoriel et maintenant je voudrais tester le référencement d'un autre livre de cuisine, j'ai donc choisi simple_iptables

J'ai ajouté cette ligne

cookbook 'simple_iptables', '~> 0.7.0'

À mon Berksfile, comme décrit dans le supermarché.

Ensuite, j'ai ajouté ces lignes à mon fichier default.rb:

include_recipe 'simple_iptables'

# Allow HTTP, HTTPS
simple_iptables_rule "http" do
  rule [ "--proto tcp --dport 80",
         "--proto tcp --dport 443" ]
  jump "ACCEPT"
end

Et je lance le livre de recettes en utilisant:

chef-client --local-mode --runlist 'recipe[learn_chef_httpd]'

Le problème est que Chef ne trouve pas le livre de recettes

Chef::Exceptions::CookbookNotFound
----------------------------------
Cookbook simple_iptables not found. If you're loading simple_iptables from anoth er cookbook, make sure you configure the dependency in your metadata

J'ai essayé de l'ajouter aux métadonnées:

depends 'simple_iptables', '~> 0.7.0'

Mais j'ai toujours une erreur:

Error Resolving Cookbooks for Run List:
Missing Cookbooks:

No such cookbook: simple_iptables

Alternative 2

J'essaie toujours de faire en sorte que cela fonctionne, alors j'ai aussi essayé de le faire "à la manière de berkshelf", alors j'ai créé un nouveau livre de recettes.

berks cookbook test

Et j'ai ajouté cette ligne

cookbook 'simple_iptables', '~> 0.7.0'

À mon Berksfile, comme décrit dans le supermarché.

Ensuite, j'ai ajouté ces lignes à mon fichier default.rb:

include_recipe 'simple_iptables'

# Allow HTTP, HTTPS
simple_iptables_rule "http" do
  rule [ "--proto tcp --dport 80",
         "--proto tcp --dport 443" ]
  jump "ACCEPT"
end

Berks exécutés installer:

berks installer

et l'a couru:

chef-client --local-mode --runlist 'recipe[test]'

La même erreur est revenue

Chef::Exceptions::CookbookNotFound
----------------------------------
Cookbook simple_iptables not found. If you're loading simple_iptables from anoth er cookbook, make sure you configure the dependency in your metadata

J'ai essayé de l'ajouter aux métadonnées:

depends 'simple_iptables', '~> 0.7.0'

Mais j'ai toujours une erreur:

Error Resolving Cookbooks for Run List:
Missing Cookbooks:

No such cookbook: simple_iptables

J'ai regardé le dossier ~ / berkshelf et les livres de recettes sont là.

** Alternative 3 **

J'ai démarré une instance de CentOS 6.5 EC2 sur Amazon, installé Ruby 2.1.3 et Chef. créé un dossier ~ / chef-repo / cookbooks

J'ai créé un livre de recettes en utilisant berkshelf, exécuté

bundle install

ajouté la référence / code comme dans les autres variantes puis

berks install

et couru comme je l'ai fait la dernière fois.

J'ai les mêmes problèmes.

Qu'est-ce que je rate? De quoi ai-je besoin pour le faire fonctionner?


14
2017-10-15 21:50


origine


Réponses:


Assurez-vous d'avoir configuré votre chef_repo_path comme décrit dans le docs.

Fondamentalement local-mode a besoin de savoir où trouver vos livres de recettes, rôles, environnements, pochettes de données, etc. Malheureusement, la documentation n'est pas très claire sur où et comment vous définissez chef_repo_path 

Voici ce que je peux dire du code.

  1. si client.rb se trouve et contient cookbook_path, chef_repo_path = "#{cookbook_path}/.."
  2. si knife.rb se trouve et contient cookbook_path, chef_repo_path = "#{cookbook_path}/.."
  3. Le chef peut essayer de deviner le chemin. Le code va chercher de pwd à la recherche d'un répertoire appelé cookbooks. S'il le trouve, alors cookbooks/.. sera défini comme votre chef_repo_path.
  4. Si tout le reste échoue, pwd sera utilisé comme votre chef_repo_path

Si vous utilisez Berkshelf, le mieux est de faire un berks vendor pour obtenir un répertoire unique, TOUS les livres de recettes dont vous avez besoin seront disponibles. Vous pouvez ensuite pointer chef_repo_path vers le parent du cookbooks répertoire contenant vos livres de recettes vendus.

Attention, cela fait 10 minutes de fouille dans le code source, alors je n’ai peut-être pas raison.


14
2017-10-16 02:45



Tout en cherchant à exécuter localement pour tester, j'ai rencontré la même erreur "Impossible de résoudre le livre de recettes". Étant donné que je souhaite potentiellement exécuter des livres de recettes sans serveur Chef mais également sans que ChefDK soit installé pour que les développeurs non-chefs puissent effectuer une installation simple, une seule fois, je mets en place le flux de travaux suivant.

Votre livre de recettes doit vivre dans un dossier sous un dossier appelé livres de recettes. Il semble que ce soit «magique», mais il semble pouvoir vivre n'importe où, par exemple userdir/projects/cookbooks/my_cookbook_name/.

Si vous avez un fichier Berksfile pour les dépendances, vous devez les obtenir localement avant de pouvoir exécuter chef-client -z -o my_cookbook_name donc courir berks vendor tirer les dépendances dans un cookbooks répertoire dans le dossier en cours.

le berks vendor commande tire vos autres dépendances dans le répertoire des livres de recettes afin que chef-zero / chef-solo puisse les trouver. Exécutez la commande suivante dans une invite Administrator PowerShell, il peut être Command Prompt compatible mais j'essaie de ne pas encourager l'utilisation de cmd.exe.

cd /path/to/cookbooks/my_cookbook_name berks vendor . chef-client -z -o my_cookbook_name

La beauté de l'utilisation du nouveau chef-zéro intégré au client est que vous n'avez pas nécessairement besoin du ChefDK complet pour tester, mais vous aurez besoin de berkshelf pour la commande berks sur au moins 1 machine, car l'installation de ChefDK est un cauchemar . Une fois que tu as berks tu peux courir berks package et copiez le fichier qu'il crée sur une machine avec juste le chef-client et ajoutez-le quelque part, puis exécutez le chef-client -z -o your_cookbook dans le répertoire contenant le cookbooks dossier.

Pour obtenir simplement le chef, utilisez le programme d'installation omnibus et vous en avez assez pour démarrer un nœud ou exécuter la recette.

. { iwr -useb https://omnitruck.chef.io/install.ps1 } | iex; install -channel stable -project chef

Si vous avez besoin de vos berks et que vous voulez un moyen rapide d'obtenir le ChefDK, cela fera l'affaire.

. { iwr -useb https://omnitruck.chef.io/install.ps1 } | iex; install -channel stable -project chefdk


2
2017-11-13 22:09



Après quelques heures de briser mon esprit en essayant une combinaison des réponses de @kilian et @ gratzy de ici, cela a aidé,

cmd /c E: && cd /d E:\Items_CI Exploration\chef\chef-repo\cookbooks\ && chef-client --local-mode --runlist 'recipe[cisamplecookbooks::web]'

Oui, sans les guillemets. Notez également le "E:" ajouté avant. Le nombre de "&" n'a cependant pas fait de différence.

"E:\Items_CI Exploration\chef\chef-repo\cookbooks\" C'est le chemin dans lequel j'ai mes livres de cuisine à exécuter. Je suppose que la dernière barre oblique ("\") à côté de cookbooks est également important.


1
2018-04-26 09:16