Предоставление бродяг с шеф-поваром
Я вникаю в то, что потребуется, чтобы перенести мои среды разработки на Vagrant, и у меня возникли проблемы с обработкой процесса подготовки VM с шеф-поваром. Я никогда раньше не использовал шеф-повара, и бродячие документы в этой области были намеренно слабыми (вне сферы охвата), поэтому я мог использовать руку.
Я хотел бы сделать это как можно более переносимым, поэтому я подумал, что имеет смысл загружать кулинарные книги из URL-адреса, поэтому я пытаюсь в своем Vagrantfile
:
config.vm.provision :chef_solo do |chef|
chef.recipe_url = 'https://github.com/opscode/cookbooks/tarball/master'
chef.add_recipe 'nginx'
chef.add_recipe 'mysql'
chef.add_role 'web'
# You may also specify custom JSON attributes:
# chef.json = { :mysql_password => '' }
end
Я не думаю, что есть вопрос, что я просто что-то недопонимаю, но я не нашел источник документации, который, похоже, подходит для этого контекста бродяг.
Спасибо.
Ответы
Ответ 1
То, как вы показываете выше, безусловно, будет работать нормально.
Однако, если вы собираетесь использовать соло Chef, я рекомендую встраивать кулинарные книги непосредственно в репозиторий, который входит в управление версиями. Это делает так, что в каждый момент времени, когда вы совершаете, Vagrantfile выравнивается с соответствующими версиями кулинарных книг. Таким образом, через 2 года, когда вы проверяете код с сегодняшнего дня, поваренные книги должны по-прежнему технически работать.
Если вы хотите пройти этот маршрут, создайте каталог, например cookbooks
, который содержит кулинарные книги. Затем настройте бродягу так:
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = "cookbooks"
chef.add_recipe 'nginx'
chef.add_recipe 'mysql'
chef.add_role 'web'
# You may also specify custom JSON attributes:
# chef.json = { :mysql_password => '' }
end
Ответ 2
К сожалению, в Vagrant не так много документации в сочетании с шеф-поваром. Я рекомендую изучить librarian, чтобы управлять своими кулинарами для вас. У меня обычно есть блок, подобный этому в моем Vagrantfile:
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = "chef/cookbooks"
chef.roles_path = "chef/roles"
# ...
end
Я создаю новый каталог в корне моего проекта под названием chef
и добавлю следующие строки в мой .gitignore
:
# Ignore librarian bundled cookbooks and cache
/chef/cookbooks
/chef/tmp
В каталоге chef
вы можете запустить librarian-chef init
и начать добавлять кулинарные книги к созданному Cheffile
таким образом, чтобы вы с Gemfile:
cookbook "apt",
:git => "git://github.com/fnichol/chef-apt.git",
:ref => "cacher-client-solo-support"
cookbook "imagemagick", "0.2.2"
cookbook "mongodb",
:git => "git://github.com/edelight/chef-cookbooks.git",
:ref => "0.11.0"
Вы получаете преимущества того, чтобы указать git репозитории, пути к файлам и версии для объединения, что очень полезно, когда вы используете кулинарные книги из нескольких источников. Когда вы запустите библиотеку librarian-chef install
, библиотекарь выберет все указанные кулинарные книги и сохранит их в каталоге cookbooks
по отношению к местоположению вашего Cheffile.
Ответ 3
Вы также можете использовать Berkshelf для управления своими кулинарами для вас. Berkshelf действительно облегчает управление кулинарными книгами.
Все, что вам нужно сделать, это установить berkshelf gem и запустить berks init для создания пустого Berksfile.
Существует несколько способов добавления кулинарных книг в файл berks для разрешения зависимостей.
Пример:
Чтобы разрешить кулинарные книги из супермаркета:
source 'http://chefsupermarket.com'
cookbook 'mycookbook', '~> 1.3.6'
Чтобы решить проблему с помощью git, используйте:
cookbook "mycookbook", git: "https://github.com/cookbooks/mycookbook.git"
вы также можете хранить кулинарные книги в своем локальном каталоге и разрешать их с помощью berksfile, используя:
cookbook 'mycookbook', path: '/path_to_my/chef/cookbook'
Ответ 4
Я предпочитаю большой монолитный репозиторий со всеми моими кулинарными книгами. Поэтому я не использую библиотекаря или Беркшельфа, просто бродягу и шеф-повару. Я использую шеф-повар для создания виртуальной машины с использованием VirtualBox, а также для "выпечки" контейнеров Docker.
Я не вижу никаких проблем с переносимостью при таком подходе. Для локального развития все мои вещи шеф-повара находятся в одном месте ~/chef
. У меня есть папка ~/chef/vagrant
, в которой есть все мои бродячие файлы.
У моего Vagrantfile
всегда будет что-то похожее на следующее.
config.vm.provision 'chef_zero' do |chef|
chef.environment = 'some_environment'
chef.cookbooks_path = '~/chef/cookbooks'
chef.roles_path = '~/chef/roles'
chef.data_bags_path = '~/chef/data_bags'
chef.encrypted_data_bag_secret_key_path = '~/chef/chef_key'
chef.environments_path = '.'
chef.nodes_path = '~/chef/nodes'
chef.add_recipe 'motd'
chef.add_recipe '..'
chef.version = '12.14.89'
# chef.log_level = 'debug'
end