使用Chef配置Vagrant

24

我正在研究将我的开发环境迁移到Vagrant,但在使用chef进行虚拟机自动化配置时遇到了些问题。我以前没有使用过chef,而且Vagrant文档在这方面的内容故意不详细(超出范围),所以需要帮助。

为了尽可能地实现可移植性,我想从URL加载cookbooks,因此在我的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

我认为我并没有理解错什么,但是我没有找到一个似乎适用于这个Vagrant上下文的文档来源。

谢谢。


如果有人最近尝试过这个,Git仓库已经更改为一个消息,要下载各个仓库,因此下载主Opscode Cookbooks分支的模式不再适用。 - Victor 'Chris' Cabral
4个回答

21

您上面提到的方法肯定可以很好地运行。

然而,如果您要使用Chef solo,我建议将cookbook直接嵌入放入版本控制的代码库中。这样,每次提交代码时,Vagrantfile都会与正确版本的cookbook对齐。因此,当您在两年后从今天检出代码时,cookbook理论上仍应该能够正常工作。

如果您想选择此路线,请创建一个名为cookbooks的目录,并在其中包含cookbook。然后按以下方式配置Vagrant:

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

16

不幸的是,在使用Vagrant和Chef的组合方面没有太多的文档。我建议你看一下使用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 中添加 cookbooks,就像处理 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 命令时,Librarian会获取所有指定的菜谱并将它们存储在 cookbooks 目录中,相对于Cheffile文件的位置。

另一个与librarian-chef类似的选择是Berkshelf。berkshelf.com。Berkshelf的小优势在于支持开发cookbook,并使用它来管理它们。这似乎不是librarian-chef推荐/支持的用例。 - Mikezx6r

0

你也可以使用Berkshelf来管理你的烹饪书。Berkshelf确实使得管理烹饪书变得容易。

你只需要安装berkshelf gem,并运行berks init来生成一个空的Berksfile。

有几种不同的方法可以将烹饪书添加到Berksfile中以解决依赖关系。

例如:

要从超市解决烹饪书,请使用:

source 'http://chefsupermarket.com'

cookbook 'mycookbook', '~> 1.3.6'

要从git解决,请使用:

cookbook "mycookbook", git: "https://github.com/cookbooks/mycookbook.git"

你也可以将 Cookbooks 保存在本地目录中,并使用 Berksfile 解决它们,方法如下:

cookbook 'mycookbook', path: '/path_to_my/chef/cookbook'

0

我更喜欢使用一个大的单体存储库来管理我的所有菜谱。因此,我不使用Librarian或Berkshelf,只用Vagrant和Chef。我使用Chef创建虚拟机(VM)使用VirtualBox,也用它来“烘焙”Docker容器。

我认为这种方法没有任何可移植性问题。对于本地开发,我的所有Chef相关内容都在一个地方~/chef。我有一个文件夹~/chef/vagrant,其中包含了所有我的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接