2012-07-04 5 views
69

Ein aktuelles Kochrezept 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 aufrüsten?Wie kann die Version von Chef kontrolliert werden, die Vagrant zur Bereitstellung von VMs verwendet?

Ich will nicht nur es den VM für die aktuelle Instanz aktualisieren - ich halte zu zerstören und diejenigen wieder aufzubauen. Muss ich etwas in der Vagrant-Basisbox oder etwas in meiner (physischen) Systeminstallation ändern?

Antwort

103

Mit dem Vagrant Plugin vagrant-omnibus funktionierte großartig für mich:

vagrant plugin install vagrant-omnibus 

Anschließend können Sie konfigurieren einfach Ihre Koch-Version in der Vagrantfile vor der Bereitstellung zu tun:

config.omnibus.chef_version = :latest 

Sie können auch eine bestimmte angeben Version:

config.omnibus.chef_version = '11.6.0' 
+11

Dies sollte abgestimmt und möglicherweise als die richtige Antwort markiert werden eher die ältere aktuell markierte richtige Antwort. – jimeh

+0

Ja. Dies ist die richtige Antwort für den Thread, da es nicht darauf ankommt, dass die Box eine Ubuntu-Maschine ist. Für ein vollständiges funktionierendes Beispiel [überprüfe mein Repo] (https://github.com/elgalu/jenkins-box-for-travis/blob/74c56b7/Vagrantfile#L25) –

+0

Funktioniert das, wenn Sie ': spätestes' durch a ersetzen spezifische Version? –

31

Erstellen Sie das Basisfeld. Erstens, bring es ohne Bereitstellung und SSH dazu.

vagrant up --no-provision 
vagrant ssh 

Führen Sie dann die Befehle aus, die Sie zum Aktualisieren der Box benötigen. Dies kann die Aktualisierung von Chef und Ruby beinhalten. Optional, aktualisieren Sie die Pakete für das Betriebssystem, etc. Sie sollten die Box von allem, was nicht erforderlich ist, wie heruntergeladene Paketdateien oder Caches aufräumen.

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

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 "Null" zu setzen, um die Größe zu reduzieren.

# 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 

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

vagrant package 
vagrant box add mynewlucid32 package.box 

Wenn Sie das gleiche Feld Namen verwenden möchten, müssen Sie die vorhandene Box (~/.vagrant.d/Boxen/BoxName) zuerst entfernen.

+0

Sie können diese und noch ein paar Befehle in einem postinstall.sh Skript finden Sie hier: https://gist.github.com/1052287 – StephenKing

+0

FYI, statt 'wget -O - https://opscode.com /chef/install.sh | sudo bash "ist das folgende Verfahren [http://wiki.opscode.com/display/chef/Installing+Omnibus+Chef+Client+on+Linux+and+Mac]. 'sudo wahr && curl -L https://www.opscode.com/chef/install.sh | sudo bash "Ersteres kann dazu führen, dass" ein gültiges Paket nicht abgerufen werden kann! " – pdeschen

40

Fügen Sie die Zeilen

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_solo Block.

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

editierten Jason Mayfield Kommentar aufzunehmen. Stellen Sie sicher, und geben Sie ihm auch eine Aufwertung. Ich fügte --no-upgrade hinzu, um Sachen zu beschleunigen und die --conservative auf der zweiten Linie zusammenzubringen. Sie könnten stattdessen tun, was Jason tat, und entfernen Sie sowohl die --no-upgrade und --conservative.

editierten von anonymen user228653 vorgeschlagen bearbeiten schließen

+0

Danke - nicht in der Lage, dies im Moment zu testen, aber klingt legitim. (Hinweis aus dem Blog: Chef wird tatsächlich zweimal ausgeführt, einmal um Chefkoch zu aktualisieren, dann einmal für echt.) –

+0

eigentlich, ich denke, Sie können ziemlich viel Ignoriere den Blog-Artikel. Das ist eine andere Lösung, aber die, die ich aus den Kommentaren ausgewählt habe, ist kurz, süß und effektiv. –

+2

getestet und funktioniert für mich –

11

Ich bin nicht in der Lage Kommentare zu Antworten schreiben, aber ich wollte über eine Notiz an Bryan Larsen Antwort hinzuzufügen. Um seinen Provisionierungsbefehl zum Laufen zu bringen, musste ich eine Zeile davor einfügen, um die nativen Erweiterungen des Gems während der Installation der neuen Chef-Version erstellen zu können. Deshalb 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 auf Ubuntu 13.04, falls das irgendjemanden interessiert.

11

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

Zum Beispiel finden Sie in der chef.version Linie in diesem Auszug aus einem Vagrantfile von 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 es, die Entwicklungsumgebungen Ihrer Teams zu standardisieren. – Mia

0

Wenn Sie Chef-Test-Küche verwenden, dann können Sie die Chef-Version in .kitchen.yml Datei angeben, wie folgt aus:

provisioner: 
    name: chef_zero 
    require_chef_omnibus: 12.6.0