Почему шеф-повар не может решить мои поваренные книги?
Введение Я учу шеф-повара для автоматизации управления сервером на работе. Я скачал 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
Вот что я могу сказать из кода.
- если
client.rb
найден и содержитcookbook_path
,chef_repo_path
знак равно"#{cookbook_path}/.."
- если
knife.rb
найден и содержитcookbook_path
,chef_repo_path = "#{cookbook_path}/.."
- Шеф-повар может попытаться угадать путь. Код будет искать с
pwd
вверх ищет каталог под названиемcookbooks
, Если он это находит, тоcookbooks/..
будет установлен как ваш chef_repo_path. - Если все остальное терпит неудачу,
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