Wie steuere ich die Version von Chef, mit der Vagrant VMs bereitstellt?


70

Ein aktuelles Chef-Rezept wird aufgrund eines Fehlers in Version 0.10.10 nicht ausgeführt. Wie kann ich die von Vagrant verwendete Version von Chef auf 0.10.12 aktualisieren?

Ich möchte es nicht nur für die aktuelle Instanz der VM aktualisieren, sondern diese ständig zerstören und neu erstellen. Muss ich etwas in der Vagrant-Basisbox oder etwas in der Installation meines (physischen) Systems ändern?

Antworten:


104

Die Verwendung des Vagrant-Plugins Vagrant-Omnibus hat bei mir hervorragend funktioniert:

vagrant plugin install vagrant-omnibus

Sie können dann einfach Ihre Chef-Version in der Vagrant-Datei konfigurieren, bevor Sie die Bereitstellung durchführen:

config.omnibus.chef_version = :latest

Sie können auch eine bestimmte Version angeben:

config.omnibus.chef_version = '11.6.0'

11
Dies sollte abgestimmt und möglicherweise als die richtige Antwort markiert werden, eher als die ältere, derzeit als richtige Antwort markierte.
Jimeh

Ja. Dies ist die richtige Antwort für den Thread, da es nicht darauf ankommt, dass die Box eine Ubuntu-Maschine ist. Ein vollständiges Arbeitsbeispiel finden Sie in meinem Repo
Leo Gallucci

Funktioniert dies, wenn Sie :latestdurch eine bestimmte Version ersetzen ?
Steve Bennett

Ja, Sie können verwendenconfig.omnibus.chef_version = '11.6.0'
ouranos

Ich habe das Plugin installiert und die Zeile vor der Bereitstellungseinstellung hinzugefügt, config.omnibus.chef_version = :latest config.vm.provision :chef_solo do |chef| aber Chef Solo scheint immer noch 10.26.0 zu verwenden und den gleichen Fehler auszulösen
Jeetendra Pujari

40

Fügen Sie die Zeilen hinzu

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"

zu Ihrem Vagrantfile vor Ihrem config.vm.provision :chef_soloBlock.

Requisiten zu Haurakis Kommentar auf http://dougireton.com/blog/2012/12/23/automatically-upgrading-chef-client-on-vagrant-up/

bearbeitet, um Jason Mayfields Kommentar aufzunehmen. Stellen Sie sicher und geben Sie ihm auch eine Gegenstimme. Ich habe hinzugefügt --no-upgrade, um die Dinge zu beschleunigen und die --conservativein der zweiten Zeile abzugleichen. Sie könnten stattdessen das tun, was Jason getan hat, und sowohl das --no-upgradeals auch das entfernen --conservative.

bearbeitet, um die vorgeschlagene Bearbeitung durch anonymen Benutzer einzuschließen228653


Danke - momentan nicht in der Lage, dies zu testen, klingt aber echt. (Anmerkung aus dem Blog: Chef wird tatsächlich zweimal ausgeführt, einmal, um Chef zu aktualisieren, dann einmal für echt.)
Steve Bennett

Eigentlich denke ich, dass man den Blog-Artikel so ziemlich ignorieren kann. Das ist eine andere Lösung, aber die, die ich aus den Kommentaren ausgewählt habe, ist kurz, süß und effektiv.
Bryan Larsen

Beachten Sie den Kommentar von Jason Mayfield unten - Wenn Ihr VM-Image nicht mit Ruby geliefert wird, müssen Sie möglicherweise auch diese Zeile hinzufügen (vor dem oben genannten):config.vm.provision :shell, inline: 'apt-get install ruby1.9.1-dev'
Steve Bennett

Ich habe diese Antwort erhalten und während es funktioniert, kann die Verwendung der Chef-Pakete eine sauberere Art sein: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

31

Erstellen Sie die Basisbox neu. Rufen Sie es zunächst ohne Bereitstellung und SSH auf.

vagrant up --no-provision 
vagrant ssh

Führen Sie dann die Befehle aus, die Sie zum Aktualisieren der Box benötigen. Dies kann das Aktualisieren von Chef und Ruby umfassen. Aktualisieren Sie optional die Pakete für das Betriebssystem usw. Sie sollten die Box von allem bereinigen, was nicht benötigt wird, z. B. heruntergeladene Paketdateien oder Caches.

Zum Beispiel verwende ich den Opscode Omnibus Full Stack Installer für Chef in meinen Vagrant-Boxen (ursprünglich mit VeeWee erstellt ) und aktualisiere auch die Pakete.

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

Vergessen Sie nicht, die Festplatte auf "Null" zu setzen, um die Größe zu verringern.

# 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

Verpacken Sie dann die Box und fügen Sie sie zur Verwendung Ihrer Vagrant-Umgebung hinzu.

vagrant package
vagrant box add mynewlucid32 package.box

Wenn Sie denselben Boxnamen verwenden möchten, müssen Sie zuerst die vorhandene Box (~ / .vagrant.d / boxen / BOXNAME) entfernen.


Sie finden diesen und einige weitere Befehle in einem Skript postinstall.sh hier: gist.github.com/1052287
StephenKing

Zu Ihrer Information, anstelle wget -O - https://opscode.com/chef/install.sh | sudo bashder folgenden ist das neue Empfehlungsverfahren . sudo true && curl -L https://www.opscode.com/chef/install.sh | sudo bashErsteres kann dazu führen, dass "ein gültiges Paket nicht abgerufen werden kann!"
pdeschen

12

Es gibt eine Reihe von Optionen, die Sie angeben können, wenn Sie Chef für die Bereitstellung verwenden. Eine davon ist version, mit der Sie die gewünschte Chef-Version angeben können.

Siehe zum Beispiel die chef.versionZeile in diesem Auszug aus einem Vagrantfilevon mir:

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

2
Meiner Meinung nach sollte dies als die richtige Antwort markiert werden. Gründe: (1) Es ist unabhängig von externen Plugins und Betriebssystemen. (2) Erleichtert die Standardisierung der Entwicklungsumgebungen Ihrer Teams.
Mia

11

Ich kann keine Kommentare zu Antworten veröffentlichen, aber ich wollte Bryan Larsens Antwort oben eine Notiz hinzufügen. Damit sein Bereitstellungsbefehl funktioniert, musste ich eine Zeile hinzufügen, bevor ich die nativen Erweiterungen von gem während der Installation der neuen Chef-Version erstellen konnte. Daher wurde es:

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'

Dies war unter Ubuntu 13.04, falls das für jemanden wichtig ist.


0

Wenn Sie Chef Test Kitchen verwenden, können Sie die Chef-Version in der .kitchen.ymlDatei wie folgt angeben :

provisioner:
  name: chef_zero
  require_chef_omnibus: 12.6.0
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.