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?

Steve Bennett
quelle

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'
mirkokiefer
quelle
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

Bryan Larsen
quelle
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.

jtimberman
quelle
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
Sam
quelle
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.

Jason Mayfield
quelle
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
Codeforester
quelle