24

我正在深入研究将我的开发环境迁移到 Vagrant 需要什么,我在使用 chef 处理 VM 配置过程时遇到了一些麻烦。我以前从未使用过 chef 并且该区域的 Vagrant 文档故意弱(超出范围),因此我可以使用手。

我想让它尽可能便携,所以我认为从 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

我不认为有任何问题我只是误解了某些东西,但我还没有找到一个似乎适合这个 Vagrant 上下文的文档源。

谢谢。

4

4 回答 4

21

您在上面显示的方式肯定会正常工作。

但是,如果您要单独使用 Chef,我建议将说明书直接嵌入到版本控制的存储库中。这使得在您提交的每个时间点,Vagrantfile 都与正确版本的说明书保持一致。因此,在 2 年内,当您从今天开始检查代码时,这些食谱在技术上应该仍然有效。

如果您想走这条路,请创建一个目录,例如cookbooks,其中包含食谱。然后像这样配置 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
于 2012-01-20T19:13:32.547 回答
16

不幸的是,没有很多关于 Vagrant 和 Chef 的文档。我建议你看看使用图书管理员来为你管理你的食谱。我的 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 installlibrarian 将获取所有指定的食谱并将它们存储在cookbooks相对于 Cheffile 位置的目录中。

于 2012-01-23T21:11:36.083 回答
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"

您还可以将说明书保存在本地目录中,并使用 berksfile 解决它们:

cookbook 'mycookbook', path: '/path_to_my/chef/cookbook'
于 2016-03-21T14:42:15.357 回答
0

我更喜欢一个包含我所有食谱的大型单体存储库。所以我不使用 Librarian 或 Berkshelf,只使用 Vagrant 和 Chef。我使用 Chef 来创建使用 VirtualBox 的 VM,但也用于“烘焙”Docker 容器。

我没有看到这种方法有任何可移植性问题。对于本地开发,我所有的 Chef 东西都在一个地方~/chef。我有一个文件夹~/chef/vagrant,里面有我所有的 Vagrant 文件。

Vagrantfile的 s 总是会有类似下面的东西。

  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
于 2017-08-08T06:12:38.197 回答