Не удается разрешить зависимость поваренной книги от повара в локальном режиме

Я делаю свои первые рецепты от шеф-повара. Я создал кулинарную книгу, которую я назвал общей, используя только один рецепт (default.rb):

apt_repository "mariadb-repo" do
  uri "http://tedeco.fi.upm.es/mirror/mariadb/repo/10.1/ubuntu"
  distribution "trusty"
  components ["main"]
  arch "amd64"
  keyserver "keyserver.ubuntu.com"
  key "CBCB082A"
end

Я добавил "зависит от apt" в конце моего metadata.rb. Если я бегу:

Starting Chef Client, version 12.5.1
resolving cookbooks for run list: ["common"]

================================================================================
Error Resolving Cookbooks for Run List:
================================================================================

Missing Cookbooks:
------------------
No such cookbook: apt

Expanded Run List:
------------------
* common


Running handlers:
[2016-01-28T13:07:17+00:00] ERROR: Running exception handlers
Running handlers complete
[2016-01-28T13:07:17+00:00] ERROR: Exception handlers complete
Chef Client failed. 0 resources updated in 01 seconds
[2016-01-28T13:07:17+00:00] FATAL: Stacktrace dumped to /home/vagrant/.chef/local-mode-cache/cache/chef-stacktrace.out
[2016-01-28T13:07:17+00:00] ERROR: 412 "Precondition Failed"
[2016-01-28T13:07:17+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)

Итак, я добавил в свой Berksfile:

source 'https://supermarket.chef.io'

cookbook 'apt'

metadata

Затем попытался установить apt cookbook в несколько мест:

$ berks install # installs to ~/.berkshelf/cookbooks/
$ berks vendor --except=common berks-cookbooks/

Первое, что я заметил, это то, что вторая команда упаковывает обе кулинарные книги, apt и my common, в указанную мной директорию (даже передавая --except=common). Nevermind: если я сейчас попробую запустить:

$ sudo chef-client --local-mode --runlist 'recipe[common]'

Из каталога моей поваренной книги (которую я назвал общей) И из каталога berks-cookbooks. Ни один из обоих не сработал, ошибка выше сохраняется. Я попробовал также со следующим client.rb в каталоге моей поваренной книги:

cookbook_path = "./berks-cookbooks"
chef_repo_path = "#{cookbook_path}"

И некоторые варианты этих...

Что мне не хватает? Как правильно удовлетворить эти зависимости с помощью chef-client в локальном режиме?

Как удовлетворить эти зависимости?

'' 'РЕДАКТИРОВАТЬ 1''': Бег без sudo не работает.

2 ответа

Решение

Клиент Chef в локальном режиме читает knife.rb как его конфигурационный файл, а не client.rb, Это имеет смысл при использовании его на рабочей станции с такими вещами, как chef-provisioning, но может быть довольно неожиданным, когда вы пытаетесь использовать локальный режим в рабочей среде.

Вообще с локальным режимом вы должны использовать berks vendor обрабатывать экспорт. Вместо бега chef-client из папки "Поваренная книга" сделайте /root/local_mode_repo или подобный, и запустить berks vendor /root/local_mode_repo/cookbooks, Тогда вы можете запустить chef-client --local-mode внутри этой папки. Конкретные имена папок в репо, как roles/ а также cookbooks/ как правило, не настраиваются.

Для локального развития шеф-клиент ищет локальный режим config.rb или же knife.rbначиная в следующем порядке $KNIFE_HOME, $PWD, .chef/, и наконец $HOME/.chef/*.

  • источник: lib/chef-config/workstation_config_loader.rb в chef-config-13.8.5 камень называется из load_config_file() метод из client.rbв chef-13.8.5 драгоценный камень

В вашем config.rb или же knife.rb, вы хотите, чтобы ваш cookbooks_path включал в себя как расположение ваших поваренных книг, так и berks_cookbooks:

cookbook_path = ["./cookbooks", "./berks-cookbooks"]

Один трюк, который я использовал для поиска всех зависимостей, - это небольшой скрипт оболочки, который создает Berksfile а затем создает berks-cookbooks каталог.

#!/usr/bin/env bash
cat <<-EOF > Berksfile
source 'https://supermarket.chef.io'
$(grep -Rh 'depends' cookbooks/* | sed 's/depends/cookbook/')
EOF

berks vendor
berks install

Обратите внимание, что berks install установит внешние поваренные книги на ваш Chef Server, чтобы они были доступны для удаленных узлов, а berks vendor это то, что вы можете использовать для местного развития с berks-cookbooks,

Один совет, я держу своего местного разработчика на один уровень выше, и мой chef-repo/.chef иметь конфигурацию для сервера chef:

    .
    ├── .chef
    │   └── knife.rb
    ├── my-chef-repo
    │   ├── berks-cookbooks
    │   ├── .chef
    │   │   └── knife.rb
    │   ├── cookbooks
    │   ├── data_bags
    │   ├── environments
    │   ├── nodes
    │   └── roles
    └── .vagrant
        └── machines
Другие вопросы по тегам