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