【问题标题】:How to control the version of Chef that Vagrant uses to provision VMs?如何控制 Vagrant 用于配置 VM 的 Chef 版本?
【发布时间】:2012-07-04 17:52:31
【问题描述】:

由于版本 0.10.10 中的错误,当前的 Chef 食谱未运行。如何将 Vagrant 使用的 Chef 版本升级到 0.10.12?

我不想只为当前的虚拟机实例更新它——我会不断地破坏和重建它们。我是否需要更改 Vagrant 基础盒中的某些内容,或者我的(物理)系统安装中的某些内容?

【问题讨论】:

    标签: rubygems chef-infra vagrant


    【解决方案1】:

    如果您使用的是 Chef Test Kitchen,那么您可以在 .kitchen.yml 文件中指定 Chef 版本,如下所示:

    provisioner:
      name: chef_zero
      require_chef_omnibus: 12.6.0
    

    【讨论】:

      【解决方案2】:

      使用 Chef 进行配置时,您可以指定多个 options。其中之一是version,它允许您指定所需的 Chef 版本。

      例如,请参阅此摘录中的 chef.version 行,来自我的 Vagrantfile

      config.vm.provision :chef_solo do |chef|
         chef.version = "10.14.2"
         chef.cookbooks_path = "cookbooks"
         chef.add_recipe("vagrant_main")
       end
      

      【讨论】:

      • 在我看来,这应该被标记为正确答案。原因:(1) 它独立于外部插件和操作系统 (2) 更容易标准化团队的开发环境。
      【解决方案3】:

      使用 Vagrant 插件 vagrant-omnibus 非常适合我:

      vagrant plugin install vagrant-omnibus
      

      然后,您可以在进行配置之前在 Vagrantfile 中简单地配置您的主厨版本:

      config.omnibus.chef_version = :latest
      

      您还可以指定特定版本:

      config.omnibus.chef_version = '11.6.0'
      

      【讨论】:

      • 这应该被投赞成票,并且可能被标记为正确答案,而不是当前标记为正确答案的旧答案。
      • 是的。这是该线程的正确答案,因为它不依赖于作为 Ubuntu 机器的盒子。对于一个完整的工作示例check my repo
      • 如果您将:latest 替换为特定版本,这是否有效?
      • 是的,你可以使用config.omnibus.chef_version = '11.6.0'
      • 我已经安装了插件并在配置设置config.omnibus.chef_version = :latest config.vm.provision :chef_solo do |chef| 之前添加了这一行,但厨师独奏似乎仍在使用10.26.0并抛出相同的错误
      【解决方案4】:

      添加行

      config.vm.provision :shell, :inline => 'apt-get install build-essential ruby1.9.1-dev --no-upgrade --yes'
      config.vm.provision :shell, :inline => "gem install chef --version 11.4.2 --no-rdoc --no-ri --conservative"
      

      在你的 config.vm.provision :chef_solo 块之前到你的 Vagrantfile。

      支持 hauraki 对 http://dougireton.com/blog/2012/12/23/automatically-upgrading-chef-client-on-vagrant-up/ 的评论

      编辑以包含 Jason Mayfield 的评论。确保也给他一个赞成票。我添加了--no-upgrade 以加快速度并匹配第二行的--conservative。您可以改为执行 Jason 所做的操作,并删除 --no-upgrade--conservative

      已编辑以包含匿名用户 228653 的建议编辑

      【讨论】:

      • 谢谢 - 目前无法对此进行测试,但听起来是合法的。 (博客中的注释:Chef 实际上运行了两次,一次是为了升级 Chef,一次是真正的。)
      • 实际上,我认为您几乎可以忽略博客文章。这是另一种解决方案,但我从 cmets 中挑选出的解决方案简短、有效且有效。
      • 请注意下面 Jason Mayfield 的评论 - 如果您的 VM 映像未附带 Ruby,您可能还需要添加这一行(在上述内容之前):config.vm.provision :shell, inline: 'apt-get install ruby1.9.1-dev'
      • 我得到了这个答案,虽然它有效,但使用厨师包可能是一种更清洁的方式:config.vm.provision :shell, :inline => 'wget -q https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/12.04/x86_64/chef_11.6.2-1.ubuntu.12.04_amd64.deb -O /tmp/chef_11.6.2-1.ubuntu.12.04_amd64.deb'config.vm.provision :shell, :inline => "dpkg -i /tmp/chef_11.6.2-1.ubuntu.12.04_amd64.deb"
      【解决方案5】:

      我无法在答案上发布 cmets,但我想在上面 Bryan Larsen 的答案中添加注释。为了让他的配置命令正常工作,我需要在它之前添加一行,以便能够在安装新的 Chef 版本期间构建 gem 原生扩展。于是就变成了:

      config.vm.provision :shell, inline: 'apt-get install ruby1.9.1-dev'
      config.vm.provision :shell, inline: 'gem install chef --version 11.4.4 --no-rdoc --no-ri'
      

      这是在 Ubuntu 13.04 上,以防万一对任何人都很重要。

      【讨论】:

        【解决方案6】:

        重建基础盒子。首先,在没有配置和 SSH 的情况下启动它。

        vagrant up --no-provision 
        vagrant ssh
        

        然后,执行更新框所需的命令。这可以包括更新 Chef 和 Ruby。 (可选)更新操作系统的软件包等。您应该清理所有不需要的东西,例如下载的软件包文件或缓存。

        例如,我在我的 Vagrant 盒子(最初使用 VeeWee 构建)中使用 Opscode Omnibus Full Stack Installer for Chef,我也更新了包。

        sudo dpkg --purge chef chef-full
        sudo true && curl -L https://www.opscode.com/chef/install.sh | sudo bash
        sudo apt-get update && sudo aptitude safe-upgrade
        sudo rm /var/cache/apt/archives/*.deb
        

        不要忘记将磁盘“归零”以减小大小。

        # a bunch of commands like gem install chef, apt-get upgrade, whatever
        sudo dd if=/dev/zero of=/EMPTY bs=1M
        sudo rm /EMPTY
        exit
        

        然后,将盒子打包,添加到你的 Vagrant 环境中使用。

        vagrant package
        vagrant box add mynewlucid32 package.box
        

        如果您想使用相同的盒子名称,您需要先删除现有的盒子 (~/.vagrant.d/boxes/BOXNAME)。

        【讨论】:

        • 您可以在此处的 postinstall.sh 脚本中找到此命令以及更多命令:gist.github.com/1052287
        • 仅供参考,而不是 wget -O - https://opscode.com/chef/install.sh | sudo bash 以下是新的 recommend 过程。 sudo true && curl -L https://www.opscode.com/chef/install.sh | sudo bash前者可能会导致“无法检索到有效的包!”
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        • 2012-02-12
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        相关资源
        最近更新 更多