【问题标题】:Provisioning Vagrant w/ Chef与厨师一起供应流浪者
【发布时间】:2012-01-20 11:53:53
【问题描述】:

我正在研究将我的开发环境迁移到 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 上下文的文档来源。

谢谢。

【问题讨论】:

  • 如果最近有人尝试过,git repo 已更改为下载单个 repos 的消息,因此这种下载 master opscode cookbooks 分支的模式不再有效。

标签: chef-infra vagrant


【解决方案1】:

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

但是,如果您要单独使用 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

【讨论】:

    【解决方案2】:

    不幸的是,没有很多关于 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,就像使用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 的位置。

    【讨论】:

    • 图书管理员的另一个选择是 Berkshelf。 berkshelf.com。 Berkshelf 的次要优势是支持开发食谱,并使用它来管理它们。对于图书管理员来说,这似乎不是推荐/支持的用例。
    【解决方案3】:

    您还可以使用 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'
    

    【讨论】:

      【解决方案4】:

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

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

      我的Vagrantfiles 总是会有类似下面的内容。

        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
      

      【讨论】:

        猜你喜欢
        • 2013-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多