Почему шеф-повар не может решить мои поваренные книги?

Введение Я учу шеф-повара для автоматизации управления сервером на работе. Я скачал chefdk 3.0 отсюда, и теперь я пытаюсь создать свою первую кулинарную книгу, используя chef.

Важно! Я использую это в среде Windows для целей тестирования, и я ожидаю, что он потерпит неудачу, поскольку в Windows нет iptables, но я не ожидаю, что он потерпит неудачу, говоря, что не может найти кулинарную книгу. Я попытался использовать кулинарную книгу Windows, и она работает.

Проблема в том, что я могу создать поваренную книгу и запустить ее, но не могу ссылаться на зависимости от супермаркета.

Я попробовал две альтернативы:

Альтернатива 1

Я использовал следующую команду для создания кулинарной книги

chef generate cookbook learn_chef_httpd

(из этого урока)

Я смог завершить урок, и теперь я хотел бы проверить ссылки на другую кулинарную книгу, поэтому я выбрал simple_iptables

Я добавил эту строку

cookbook 'simple_iptables', '~> 0.7.0'

На мой Berksfile, как описано в супермаркете.

Затем я добавил эти строки в мой файл 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

И я запускаю поваренную книгу, используя:

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

Проблема в том, что повар не находит поваренную книгу

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

Я попытался добавить его к метаданным:

depends 'simple_iptables', '~> 0.7.0'

Но я все еще получаю ошибку:

Error Resolving Cookbooks for Run List:
Missing Cookbooks:

No such cookbook: simple_iptables

Альтернатива 2

Я все еще пытаюсь заставить это работать, поэтому я также попытался сделать это "способом беркелфа", поэтому я создал новую кулинарную книгу.

berks cookbook test

И я добавил эту строку

cookbook 'simple_iptables', '~> 0.7.0'

На мой Berksfile, как описано в супермаркете.

Затем я добавил эти строки в мой файл 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 установить

и запустил его:

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

Вернулась та же ошибка

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

Я попытался добавить его к метаданным:

depends 'simple_iptables', '~> 0.7.0'

Но я все еще получаю ошибку:

Error Resolving Cookbooks for Run List:
Missing Cookbooks:

No such cookbook: simple_iptables

Я посмотрел на папку ~/berkshelf и там есть кулинарные книги.

** Альтернатива 3 **

Я запустил экземпляр CentOS 6.5 EC2 на Amazon, установил Ruby 2.1.3 и Chef. создал папку ~/chef-repo/cookbooks

Я создал кулинарную книгу, используя Berkshelf, побежал

bundle install

добавили ссылку / код, как в других альтернативах, то

berks install

и бежал так же, как я делал в прошлый раз.

У меня такие же проблемы.

Что мне не хватает? Что мне нужно, чтобы это работало?

3 ответа

Решение

Убедитесь, что вы настроили chef_repo_path как описано в документах.

В принципе local-mode нужно знать, где найти ваши кулинарные книги, роли, окружение, пакеты данных и т. д. К сожалению, в документации не очень ясно, где и как вы устанавливаете chef_repo_path

Вот что я могу сказать из кода.

  1. если client.rb найден и содержит cookbook_path, chef_repo_path знак равно "#{cookbook_path}/.."
  2. если knife.rb найден и содержит cookbook_path, chef_repo_path = "#{cookbook_path}/.."
  3. Шеф-повар может попытаться угадать путь. Код будет искать с pwd вверх ищет каталог под названием cookbooks, Если он это находит, то cookbooks/.. будет установлен как ваш chef_repo_path.
  4. Если все остальное терпит неудачу, pwd будет использоваться как ваш chef_repo_path

Если вы используете Berkshelf, лучше всего сделать berks vendor Для того, чтобы получить единый каталог, будут ВСЕ поваренные книги, которые вам нужны. Затем вы можете указать chef_repo_path к родителю cookbooks каталог, который содержит ваши продаваемые поваренные книги.

Имейте в виду, это от 10 минут копания в исходном коде, так что я, возможно, не совсем понял.

При поиске локального запуска для тестирования я столкнулся с той же ошибкой "не удается разрешить кулинарную книгу". Поскольку я потенциально хочу запускать поваренные книги без сервера Chef, но также без установленного ChefDK, чтобы разработчики, не являющиеся пользователями Chef, могли выполнить простую настройку рабочей станции один раз, я собрал следующий рабочий процесс.

Ваша кулинарная книга должна находиться в папке, которая называется кулинарной книгой, это похоже на закодированную "магию", но, похоже, она может жить где угодно, например userdir/projects/cookbooks/my_cookbook_name/,

Если у вас есть Berksfile для зависимостей, вам нужно получить их локально, прежде чем вы сможете запустить chef-client -z -o my_cookbook_name так беги berks vendor чтобы вытащить зависимости в cookbooks каталог в текущей папке.

berks vendor Команда вытягивает ваши другие зависимости в каталог cookbooks, чтобы chef-zero / chef-solo мог их найти. Запустите следующее в командной строке администратора PowerShell, это может быть Command Prompt совместимо, но я стараюсь не поощрять использование cmd.exe.

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

Прелесть использования нового chef-zero, встроенного в клиент, заключается в том, что вам необязательно нужен полный ChefDK для тестирования, хотя вам понадобится berkshelf для команды berks хотя бы на 1 машине, так как установка без ChefDK - это кошмар, Когда у вас есть berks Вы можете запустить berks package и скопируйте файл, который он создает, на компьютер только с клиентом chef и добавьте его куда-нибудь, а затем запустите chef-client -z -o your_cookbook в каталоге, содержащем cookbooks папка.

Чтобы получить просто повар, используйте установщик omnibus, и у вас будет достаточно, чтобы запустить узел или запустить рецепт.

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

Если вам нужны ваши берксы и вам нужен быстрый способ получить ChefDK, это поможет.

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

После нескольких часов безумного размышления, попробовав комбинацию ответов @kilian и @ gratzy, это помогло,

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

Да, без кавычек. Также обратите внимание на добавленную ранее букву "E:". Число '&' не имеет значения, хотя.

"E:\Items_CI Exploration\chef\chef-repo\cookbooks\" это путь, по которому я должен был запустить свои кулинарные книги. Я думаю, последний слэш ("\") рядом с cookbooks тоже важно.

Другой вариант: приведенная ниже ошибка также может появиться, если в вашей роли / названии рецепта есть опечатка.

Missing Cookbooks:
------------------
The following cookbooks are required by the client but don't exist on the server:
* some-cookbook-name

После того, как вы загрузили свою кулинарную книгу на сервер шеф-повара, убедитесь, что вы назвали правильное имя в своем списке выполнения, например:

$ cd <chef-repo-path>
$ chef generate cookbook example
$ knife cookbook upload example

//output:
Uploading example [0.1.0]
Uploaded 1 cookbook.

$ vim roles/example-role.rb
 
name "example-role"
description "example to some role"
run_list    "recipe[example]"

//save and upload
$ knife role from file example-role.rb
Другие вопросы по тегам