如何控制Vagrant用于配置VM的Chef版本?


70

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

我不想只是为VM的当前实例更新它-我一直在销毁和重建它们。我是否需要在“无业游民”基本框或我的(物理)系统的安装中进行某些更改?

Answers:


104

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

vagrant plugin install vagrant-omnibus

然后,您可以在配置之前先在Vagrantfile中配置您的Chef版本:

config.omnibus.chef_version = :latest

您还可以指定特定版本:

config.omnibus.chef_version = '11.6.0'

11
应该对此进行投票,并可能将其标记为正确答案,而不是较早的当前标记为正确答案。
jimeh

是。这是该线程的正确答案,因为它并不依赖于所用的Ubuntu计算机。有关完整的工作示例,请查看我的仓库
Leo Gallucci,

如果您替换:latest为特定版本,是否可以使用?
史蒂夫·贝内特

是的,您可以使用config.omnibus.chef_version = '11.6.0'
ouranos'4

我已经安装了插件,并在设置设置之前添加了该行, config.omnibus.chef_version = :latest config.vm.provision :chef_solo do |chef| 但是厨师solo似乎仍在使用10.26.0并抛出相同的错误
Jeetendra Pujari 2014年

40

添加行

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"

在您屏蔽之前转到您的Vagrantfile config.vm.provision :chef_solo

hauraki在http://dougireton.com/blog/2012/12/23/automatically-upgrading-chef-client-on-vagrant-up/上的评论的道具

编辑以包括杰森·梅菲尔德的评论。确保也给他投票。我增加--no-upgrade了速度以匹配--conservative第二行。您可以改为执行Jason的操作,并删除--no-upgrade--conservative

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


谢谢-目前尚无法测试,但听起来合法。(博客中的注释:Chef实际上运行了两次,一次升级了Chef,然后一次了。)
Steve Bennett

实际上,我认为您几乎可以忽略博客文章。这是另一种解决方案,但是我从评论中挑选的解决方案简短,甜美且有效。
布莱恩·拉尔森

请注意Jason Mayfield在下面的评论-如果您的VM映像不随Ruby一起提供,您可能还需要添加此行(在上面之前):config.vm.provision :shell, inline: 'apt-get install ruby1.9.1-dev'
Steve Bennett

我得到了这个答案,虽然可行,但使用厨师包可能是一种更干净的方法: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"
coredump 2013年

31

重建基本框。首先,在不进行预配和使用SSH的情况下启动它。

vagrant up --no-provision 
vagrant ssh

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

例如,我在我的Vagrant框中使用了Chef的Opscode Omnibus Full Stack Full Installer安装程序(最初由VeeWee构建),并且我也更新了软件包。

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
StephenKing 2012年

仅供参考,而不是wget -O - https://opscode.com/chef/install.sh | sudo bash以下是新的推荐过程。sudo true && curl -L https://www.opscode.com/chef/install.sh | sudo bash前者可能会导致“无法检索有效的程序包!”
pdeschen

12

使用Chef进行配置时,可以指定许多选项。其中之一是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

2
我认为这应标记为正确答案。原因:(1)它独立于外部插件和操作系统(2)使标准化团队的开发环境更加容易。
Mia

11

我无法对答案发表评论,但是我想在上面的布莱恩·拉森答案中添加注释。为了使他的配置命令起作用,我需要在其前面添加一行,以便能够在安装新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上进行的,以防万一。


0

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

provisioner:
  name: chef_zero
  require_chef_omnibus: 12.6.0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.