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

Введение Я изучаю шеф-повар, чтобы автоматизировать управление сервером на работе. Я скачал 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