web-dev-qa-db-fra.com

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

Intro J'apprends à Chef à automatiser la gestion des serveurs au travail . J'ai téléchargé chefdk 3.0 depuis ici Je tente maintenant de créer mon premier livre de recettes en utilisant chef.

Important J'utilise ceci dans un environnement Windows à des fins de test. Je m'attends à ce qu'il échoue car Windows ne dispose pas d'iptables, mais je ne m'attends pas à ce qu'il échoue en disant qu'il ne trouve pas le livre de recettes. . J'ai essayé d'utiliser Livre de recettes Windows et cela 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 à des dépendances de 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 didacticiel et maintenant, j'aimerais tester le référencement d'un autre livre de recettes. 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 cuisine en utilisant:

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

Le problème est que le 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 je reçois toujours une erreur:

Error Resolving Cookbooks for Run List:
Missing Cookbooks:

No such cookbook: simple_iptables

Alternative 2

J'essaie toujours de le faire fonctionner, 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 je reçois 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 cuisine sont là.

** Alternative 3 **

J'ai démarré une instance 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 cuisine en utilisant berkshelf, a couru 

bundle install

ajouté la référence/code comme dans les autres agents de substitution puis

berks install

et couru de la même façon que j'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 que cela fonctionne?

15
JSBach

Assurez-vous que vous avez configuré votre chef_repo_path comme décrit dans docs

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

Voici ce que je peux dire du code.

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

Si vous utilisez Berkshelf, votre meilleur choix est de créer un berks vendor afin d'obtenir un seul répertoire contenant TOUS les livres de recettes dont vous avez besoin. Vous pouvez ensuite pointer chef_repo_path vers le parent du répertoire cookbooks qui contient vos livres de recettes vendus.

Remarquez que cela fait 10 minutes de fouille dans le code source, donc je n’ai peut-être pas tout à fait raison.

17
Tejay Cardon

Tout en cherchant à exécuter localement pour les tests, j'ai rencontré la même erreur "ne peut pas résoudre le livre de recettes". Étant donné que je souhaite potentiellement exécuter des livres de recettes sans serveur Chef, mais également sans ChefDK pour que les développeurs autres que Chef puissent effectuer une configuration simple du poste de travail, j'ai mis en place le flux de travail suivant. 

Votre livre de recettes doit habiter dans un dossier situé sous un dossier appelé livres de recettes. Il semble que ce soit un code "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. Exécutez donc berks vendor pour extraire les dépendances dans un répertoire cookbooks du dossier en cours.

La commande berks vendor place vos autres dépendances dans le répertoire des livres de recettes afin que chef-zero/chef-solo puisse les trouver. Exécutez ce qui suit dans une invite Administrateur PowerShell. Il est peut-être compatible avec Command Prompt 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

L'intérêt d'utiliser le nouveau chef-zéro intégré dans le client réside dans le fait que vous n'avez pas nécessairement besoin du logiciel ChefDK complet à tester, bien que vous ayez besoin de berkshelf pour la commande berks sur au moins 1 ordinateur car le fait de l'installer sans le ChefDK est un cauchemar . Une fois que vous avez berks, vous pouvez exécuter berks package et copier le fichier qu'il crée sur une machine avec uniquement le chef-client et l'extraire quelque part, puis exécutez le chef-client -z -o your_cookbook dans le répertoire contenant le dossier cookbooks.

Pour obtenir simplement le chef, utilisez le programme d’installation omnibus et vous en aurez assez pour amorcer 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 clés 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
dragon788

Après quelques heures à me changer les idées 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 pas fait de différence.

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

1
Anand Thanumalayan