Почему шеф-повар не разрешает мои кулинарные книги?
Введение
Я изучаю шеф-повар, чтобы автоматизировать управление сервером на работе.
Я скачал chefdk 3.0 из здесь
и теперь я пытаюсь построить свою первую кулинарную книгу с помощью шеф-повара.
Внимание!
Я использую это в среде 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
Я все еще пытаюсь заставить его работать, поэтому я также попытался сделать его "способом berkshelf", поэтому я создал новую кулинарную книгу.
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 install:
berks install
и запустил его:
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
и выполнялся так же, как в прошлый раз.
У меня были те же проблемы.
Что мне не хватает? Что мне нужно, чтобы заставить его работать?
Ответы
Ответ 1
Убедитесь, что вы настроили свой chef_repo_path
, как описано в docs.
В основном 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 минут копания в исходном коде, поэтому у меня может не получиться совершенно правильно.
Ответ 2
После нескольких часов разрыва моего разума, пытающегося сочетать ответы @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
также важен.
Ответ 3
При попытке запустить локально для тестирования я столкнулся с той же ошибкой "не могу разрешить кулинарию". Поскольку я потенциально хочу запускать кулинарные книги без Chef-сервера, но также без ChefDK, установленного для разработчиков, отличных от шеф-повара, для простой установки одной рабочей станции, я собрал следующий рабочий процесс.
Ваша поваренная книга должна жить в папке под папкой, называемой кулинарной книгой, это, кажется, жестко закодированное "волшебство", но, похоже, оно может жить где угодно, например userdir/projects/cookbooks/my_cookbook_name/
.
Если у вас есть файл Berks для зависимостей, необходимых для их локального использования, прежде чем вы сможете запустить chef-client -z -o my_cookbook_name
, запустите berks vendor
, чтобы вывести зависимости в каталог cookbooks
в текущей папке.
Команда berks vendor
вытягивает ваши другие зависимости в каталог кулинарных книг, чтобы их могли найти 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
Красота использования нового шеф-повара, встроенного в клиент, - это не обязательно полный тест ChefDK для тестирования, хотя вам понадобится berkshelf для команды berks, по крайней мере, на 1 машине, поскольку это будет установлено без ChefDK это кошмар. После того, как у вас есть berks
, вы можете запустить berks package
и скопировать файл, который он создает, на компьютер с помощью только шеф-клиента, а затем добавить его где-нибудь, а затем запустить chef-client -z -o your_cookbook
в каталоге, содержащем папку cookbooks
.
Чтобы получить только шеф-повара, используйте установщик omnibus, и вам достаточно, чтобы загрузить node или запустить рецепт.
. { 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