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