我在笔记本电脑上使用Vagrant 在本地进行所有开发。当食谱准备好后,它会被推送到新的 Git 存储库主页并集成到我的生产厨师服务器基础架构中。
以下示例在 virtualbox 映像上运行 nginx。
示例
安装 vagrant 插件(只需一次):
vagrant plugin install vagrant-omnibus
vagrant plugin install vagrant-berkshelf
vagrant plugin install vagrant-chef-zero
使用Berkshelf 生成一个新的application cookbook。
$ berks cookbook demo
create demo/files/default
create demo/templates/default
create demo/attributes
create demo/definitions
create demo/libraries
create demo/providers
create demo/recipes
create demo/resources
create demo/recipes/default.rb
create demo/metadata.rb
create demo/LICENSE
create demo/README.md
create demo/Berksfile
create demo/Thorfile
create demo/chefignore
create demo/.gitignore
run git init from "./demo"
create demo/Gemfile
create demo/Vagrantfile
编辑以下文件(详情如下):
- Vagrantfile
- metadata.rb
- recipes/default.rb
运行 vagrant 将启动使用 chef-client 配置的虚拟机。 chef zero 插件将运行 chef-server 的本地嵌入式实例。 berkself 插件用于自动加载说明书依赖。
vagrant up
以下命令将重新运行 chef-client(编辑后):
vagrant provision
最后,使用本地虚拟化进行开发的真正巨大优势在于,您可以拆除所有内容并从头开始重新构建:
vagrant destroy -f && vagrant up
流浪文件
控制 vagrant 的操作。在这种情况下,我只启动了一个使用 chef-client 配置的 VM:
Vagrant.require_plugin "vagrant-omnibus"
Vagrant.require_plugin "vagrant-berkshelf"
Vagrant.require_plugin "vagrant-chef-zero"
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# Box config
config.vm.box = "saucy64"
config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/saucy/current/saucy-server-cloudimg-amd64-vagrant-disk1.box"
# Virtualbox config
config.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", 1024]
end
# Networking config
config.vm.network "private_network", ip: "10.0.0.10"
# Plugin config
config.omnibus.chef_version = :latest
config.chef_zero.enabled = true
config.berkshelf.enabled = true
# Chef config
config.vm.provision :chef_client do |chef|
chef.add_recipe "demo"
end
end
omnibus 插件负责安装所需版本的 chef。 Berkshelf 插件将下载说明书依赖项,并在与 chef-zero 结合使用时,将在每次配置运行期间上传说明书。
元数据.rb
将 nginx 添加为说明书依赖项:
name 'demo'
maintainer 'YOUR_NAME'
maintainer_email 'YOUR_EMAIL'
license 'All rights reserved'
description 'Installs/Configures demo'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version '0.1.0'
depends "nginx"
Berksfile 已预先配置为从社区食谱存储库加载元数据文件中列出的食谱依赖项。
site :opscode
metadata
食谱/default.rb
运行默认的 nginx 配方
#
# Cookbook Name:: demo
# Recipe:: default
#
# Copyright (C) 2014 YOUR_NAME
#
# All rights reserved - Do Not Redistribute
#
include_recipe "nginx"