2012-07-04 24 views
69

Una receta actual de Chef no se está ejecutando debido a un error en la versión 0.10.10. ¿Cómo puedo actualizar la versión de Chef que usa Vagrant a 0.10.12?¿Cómo controlar la versión de Chef que Vagrant usa para aprovisionar máquinas virtuales?

No quiero simplemente actualizarlo para la instancia actual de la VM - sigo destruyendo y reconstruyendo esos. ¿Debo cambiar algo en la caja base de Vagrant, o algo en la instalación de mi sistema (físico)?

Respuesta

103

Usando el plugin Vagrant vagrant-omnibus funcionó muy bien para mí:

vagrant plugin install vagrant-omnibus 

continuación, puede simplemente configurar su versión de chef en la Vagrantfile antes de realizar el aprovisionamiento:

config.omnibus.chef_version = :latest 

También puede especificar una específica versión:

config.omnibus.chef_version = '11.6.0' 
+11

Esto debe votarse y posiblemente marcarse como la respuesta correcta más bien, la respuesta correcta actualmente marcada más vieja. – jimeh

+0

Sí. Esta es la respuesta correcta para el hilo, ya que no depende de que la caja sea una máquina Ubuntu. Para obtener un ejemplo de trabajo completo [consulte mi informe] (https://github.com/elgalu/jenkins-box-for-travis/blob/74c56b7/Vagrantfile#L25) –

+0

Funciona si reemplaza ': latest' por un versión específica? –

31

Reconstruye la caja base. Primero, créelo sin aprovisionamiento y SSH.

vagrant up --no-provision 
vagrant ssh 

Luego, realice los comandos que necesita para actualizar la caja. Esto puede incluir la actualización de Chef y Ruby. Opcionalmente, actualice los paquetes para el sistema operativo, etc. Debe limpiar el cuadro de todo lo que no se requiere, como los archivos de paquete descargados o las memorias caché.

Por ejemplo, uso Opscode Omnibus Full Stack Installer for Chef en mis cajas Vagrant (originalmente construidas con VeeWee) y también actualizo los paquetes.

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 

No olvide "poner a cero" el disco para reducir el tamaño.

# 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 

A continuación, el paquete de la caja y añadirlo a su entorno de Vagrant para su uso.

vagrant package 
vagrant box add mynewlucid32 package.box 

Si desea utilizar el mismo nombre de la caja, usted tendrá que quitar la caja existente (~/.vagrant.d/cajas/BOXNAME) en primer lugar.

+0

puede encontrar esto y un poco más de comandos en un script postinstall.sh aquí: https://gist.github.com/1052287 – StephenKing

+0

su información, en lugar de 'wget -O - https://opscode.com /chef/install.sh | sudo bash' el siguiente es el nuevo procedimiento [recommend] (http://wiki.opscode.com/display/chef/Installing+Omnibus+Chef+Client+on+Linux+and+Mac). 'sudo true && curl -L https://www.opscode.com/chef/install.sh | sudo bash' ¡El primero puede llevar a "no poder recuperar un paquete válido"! – pdeschen

40

Agregar las líneas

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" 

a su Vagrantfile antes de su bloque config.vm.provision :chef_solo.

apoyos a comentario de hauraki en http://dougireton.com/blog/2012/12/23/automatically-upgrading-chef-client-on-vagrant-up/

vez haya incluido en el comentario de Jason Mayfield. Asegúrate de darle un voto positivo también. Agregué --no-upgrade para acelerar las cosas y coincidir con el --conservative en la segunda línea. En su lugar, podría hacer lo que hizo Jason, y eliminar tanto el --no-upgrade como el --conservative.

editado para incluir editar sugerido por user228653 anónima

+0

Gracias - no estoy en condiciones de probar esto en este momento, pero suena legítimo. (Nota del blog: El chef en realidad se ejecuta dos veces, una para actualizar Chef, y una vez de verdad) –

+0

en realidad, creo que puedes casi ignore el artículo del blog. Esa es otra solución, pero la que elegí de los comentarios es corta, amable y efectiva. –

+2

probado y en funcionamiento para mí –

11

no puedo enviar comentarios sobre las respuestas, pero quería añadir una nota a la respuesta de Bryan Larsen anteriormente. Para que su comando de aprovisionamiento funcionara, necesitaba agregar una línea antes de poder crear las extensiones gemelas nativas durante la instalación de la nueva versión de Chef. Por lo tanto, se convirtió en:

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' 

Esto estaba en Ubuntu 13.04, en caso de que le importe a alguien.

11

Hay un número de options puede especificar cuándo usar Chef para el aprovisionamiento. Uno de estos es version, que le permite especificar la versión de Chef que desea.

Por ejemplo, ver la línea chef.version en este extracto de un Vagrantfile mío:

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

En mi opinión, esto debería marcarse como la respuesta correcta. Razones: (1) es independiente de los complementos externos y los sistemas operativos (2) hacen que sea más fácil estandarizar los entornos de desarrollo de sus equipos. – Mia

0

Si está utilizando Chef Test Kitchen, a continuación, se puede especificar la versión Chef en .kitchen.yml archivo, así:

provisioner: 
    name: chef_zero 
    require_chef_omnibus: 12.6.0 
Cuestiones relacionadas