Назад | Перейти на главную страницу

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

Свои первые рецепты готовлю в шеф-поваре. Я создал кулинарную книгу, которую назвал общей, всего с одним рецептом (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]'

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

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

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

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

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

'' 'EDIT 1' '': запуск без sudo не работает.

Клиент 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/ обычно не настраиваются.

Для локальной разработки chef-client local-mode ищет 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
    │   └── knife.rb
    ├── my-chef-repo
    │   ├── berks-cookbooks
    │   ├── .chef
    │   │   └── knife.rb
    │   ├── cookbooks
    │   ├── data_bags
    │   ├── environments
    │   ├── nodes
    │   └── roles
    └── .vagrant
        └── machines