2012-02-12 11 views
44

In questo momento ho il seguente nel mio Vagrantfile:Come posso ottenere Chef per eseguire apt-get update prima di eseguire altre ricette

config.vm.provision :chef_solo do |chef| 
    chef.cookbooks_path = "cookbooks" 
    chef.add_recipe "apt" 
    chef.add_recipe "build-essential" 
    chef.add_recipe "chef-redis::source" 
    chef.add_recipe "openssl" 
    chef.add_recipe "git" 
    chef.add_recipe "postgresql::server" 
    chef.add_recipe "postgresql::client" 
end 

Per installare il software aggiunto alla mia recipe_list, ho bisogno di ottenere la VM per emettere un aggiornamento apt-get prima di installare l'altro software.

Ho avuto l'impressione che questa fosse una delle caratteristiche della ricetta "apt" - che avrebbe eseguito l'aggiornamento per prima cosa.

L'uscita quando faccio una vagabonda disposizione è:

[Sat, 11 Feb 2012 22:20:03 -0800] INFO: *** Chef 0.10.2 *** 
[Sat, 11 Feb 2012 22:20:03 -0800] INFO: Setting the run_list to ["recipe[apt]", "recipe[build-essential]", "recipe[chef-redis::source]", "recipe[openssl]", "recipe[git]", "recipe[postgresql::server]", "recipe[postgresql::client]", "recipe[vagrant-main]"] from JSON 
[Sat, 11 Feb 2012 22:20:03 -0800] INFO: Run List is [recipe[apt], recipe[build-essential], recipe[chef-redis::source], recipe[openssl], recipe[git], recipe[postgresql::server], recipe[postgresql::client], recipe[vagrant-main]] 
[Sat, 11 Feb 2012 22:20:03 -0800] INFO: Run List expands to [apt, build-essential, chef-redis::source, openssl, git, postgresql::server, postgresql::client, vagrant-main] 
[Sat, 11 Feb 2012 22:20:03 -0800] INFO: Starting Chef Run for lucid32 
[Sat, 11 Feb 2012 22:20:03 -0800] INFO: Processing package[postgresql-client] action install (postgresql::client line 37) 
[Sat, 11 Feb 2012 22:20:04 -0800] ERROR: package[postgresql-client] (postgresql::client line 37) has had an error 
[Sat, 11 Feb 2012 22:20:04 -0800] ERROR: Running exception handlers 
[Sat, 11 Feb 2012 22:20:04 -0800] ERROR: Exception handlers complete 
[Sat, 11 Feb 2012 22:20:04 -0800] FATAL: Stacktrace dumped to /tmp/vagrant-chef-1/chef-stacktrace.out 
[Sat, 11 Feb 2012 22:20:04 -0800] FATAL: Chef::Exceptions::Exec: package[postgresql-client] (postgresql::client line 37) had an error: apt-get -q -y install postgresql-client=8.4.8-0ubuntu0.10.04 returned 100, expected 0 
+0

Chef 12,7 introdotto un nativo 'apt_update' risorsa che rende la maggior parte di queste risposte obsoleti. https://docs.chef.io/resource_apt_update.html – spuder

risposta

3

Mi sembra di essere stato in grado di risolvere il problema applicando la seguente patch:

https://github.com/wil/cookbooks/commit/a470a4f68602ec3bf3374830f4990a7e19e9de81

+4

Questo è un modo molto strano per installare un pacchetto (cioè usando' action: nothing' e 'run_action (: install)'. Questo sembra installare il pacchetto nella fase di compilazione dell'esecuzione di chef-client invece di eseguire la fase.Per ulteriori dettagli, consultare [http://wiki.opscode.com/display/chef/Anatomy+of+a+Chef+Run] Aggiunta di 'recipe [apt]' nella parte anteriore dell'elenco di esecuzione di un nodo dovrebbe normalmente eseguire 'apt-get install' come prima azione –

+1

" Aggiungere la ricetta [apt] alla parte anteriore dell'elenco di esecuzione di un nodo dovrebbe normalmente eseguire apt-get install come prima azione. "ha funzionato per me. –

21

apt-get update dovrebbe essere in esecuzione prima il modo in cui lo avete. Tuttavia, la ricetta verrà aggiornato solo una volta ogni 24 ore:

execute "apt-get-update-periodic" do 
    command "apt-get update" 
    ignore_failure true 
    only_if do 
    File.exists?('/var/lib/apt/periodic/update-success-stamp') && 
    File.mtime('/var/lib/apt/periodic/update-success-stamp') < Time.now - 86400 
    end 
end 
+1

Il problema è che l'aggiornamento apt-get non viene eseguito inizialmente. Inoltre, sembra che chef.add_recipe "postgresql :: server" e chef.add_recipe "postgresql :: client" stiano correndo per primi, prima della ricetta apt. – ashchristopher

+0

Questo è davvero strano, ma dovrebbe funzionare. Potresti provare a rimuovere/var/lib/apt/periodic/update-success-stamp una volta? – StephenKing

+0

@ashchristopher - Vuoi che funzioni inizialmente - vedi la risposta qui sotto. Anch'io lo volevo. – jmontross

1

Il modo più semplice e diretto per risolvere il problema è applicando la seguente patch (h/t @ashchristopher):

https://github.com/wil/cookbooks/commit/a470a4f68602ec3bf3374830f4990a7e19e9de81

Il problema è che la ricetta postgresql::client esegue l'azione di installazione sulle risorse del pacchetto su postgresql/recipes/client.rb:39 e 44 su compile-time anziché sul tempo di esecuzione come normale (h/t Tim Potter), causandone la valutazione da parte di Chef (e quindi installato) prima di qualsiasi cosa altrimenti corre.

pg_packages.each do |pg_pack| 
    package pg_pack do 
    action :nothing 
    end.run_action(:install) 
end 

gem_package "pg" do 
    action :nothing 
end.run_action(:install) 

Credo che questo viene fatto in servizio del fornitore di postgres 's la database cookbook, che dipende dalla postgresql libro di cucina e si basa sul pg gemma in fase di installazione prima che compilerà. L'applicazione della suddetta patch potrebbe interrompere il ricettario database.

L'altra soluzione alternativa sarebbe quella di creare una ricetta che funziona apt-get update anche in fase di compilazione e metterlo nel vostro run_list prima della postgresql libro di cucina. Nella sua forma più semplice, che probabilmente sarebbe qualcosa di simile:

execute "apt-get update" do 
    action :nothing 
end.run_action(:install) 
10

Ci sono tre risorse che lo farà bene su un sistema Ubuntu, in particolare in uso su 12.04 precise a 64 bit da me.

  1. apt-get update-a piacimento quando altre ricette richiedono

  2. pacchetto di installazione update-notifier-comune che ci dà timestamp su aggiornamenti

  3. controllo i timestamp e aggiornare periodicamente. In questo caso in basso dopo 86400 secondi.

Ed ecco quelle tre ricette.

execute "apt-get-update" do 
    command "apt-get update" 
    ignore_failure true 
    action :nothing 
end 

package "update-notifier-common" do 
    notifies :run, resources(:execute => "apt-get-update"), :immediately 
end 

execute "apt-get-update-periodic" do 
    command "apt-get update" 
    ignore_failure true 
    only_if do 
    File.exists?('/var/lib/apt/periodic/update-success-stamp') && 
    File.mtime('/var/lib/apt/periodic/update-success-stamp') < Time.now - 86400 
    end 
end 
+0

Grazie - this sta lavorando per me con un piccolo cambiamento - la prima chiamata execute dovrebbe essere con 'apt-get-update'. –

+0

grazie - Ho aggiornato la risorsa per chiamare "apt-get-update" – jmontross

30

È possibile includere la ricetta apt in fin dall'inizio:

include_recipe 'apt' 

questo verrà eseguito il comando di aggiornamento.

+1

per me ho dovuto: 'include_recipe ' apt'' – badmadrad

1

Senza applicazione di patch, questo è un approccio generico al problema che aggiornerà su ogni corsa:

bash "update-apt-repository" do 
    user "root" 
    code <<-EOH 
    apt-get update 
    EOH 
end 

Può valere la pena considerare che una tale corsa, su ogni corsa, lega un bel po 'di sistema risorse per circa 30 secondi; si consiglia di avere una ricetta speciale di nome ricetta :: update_apt che è stato eseguito tramite cron o attraverso qualche altro evento cioè

chef-client -o "recipe[yourrecipe::update_apt]" 
8

Sembra che l'ultima versione del libro di cucina Opscode apt consentono di eseguirlo in fase di compilazione tempo.

config.vm.provision :chef_solo do |chef| 
    chef.cookbooks_path = "cookbooks" 
    chef.add_recipe "apt" 
    chef.json = { "apt" => {"compiletime" => true} } 
end 

Finché apt viene eseguito prima di altri libri di cucina compiletime (come Postgres) nell'elenco corsa, questo dovrebbe funzionare.

+0

ha funzionato per me, grazie – dmirkitanov

1

Per eseguire apt-get update in fase di compilazione, fare:

e = execute "apt-get update" do 
    action :nothing 
end 

e.run_action(:run) 

controllo https://wiki.opscode.com/display/chef/Evaluate+and+Run+Resources+at+Compile+Time

+0

Il link è rotto –

+0

https://web.archive.org/web/20120913065512/http://wiki.opscode.com/display/chef/Evaluate+and+Run+Resources+at+Compile+Time – Rudger

+1

Qualcosa di strano è con il wiki, il link non è raggiungibile senza un sessionid. il collegamento archive.org funziona comunque. forse questo funziona anche: https://wiki.opscode.com/display/chef/Evaluate+and+Run+Resources+at+Compile+Time;jsessionid=BBE750D0DC249823649B3F4F70F24C82 – Rudger

0

ho avuto la stessa situazione, e nel mio caso, libro di cucina appartamento era secondo dopo quello che ha chiesto l'installazione del pacchetto. Lascialo qui, quindi forse qualcuno ne trarrà beneficio. Controlla l'ordine dei libri di cucina nella tua lista, ruolo o altrove.

0

solo un promemoria amichevole che l'aggiunta di tutte quelle ricette all'interno della disposizione vaghe può diventare rapidamente ingestibile.

Un modello migliore è quello di creare un ruolo cuoco chef/my-fancy-role.rb

# Name of the role should match the name of the file 
name "my-fancy-role" 

# Run list function we mentioned earlier 
run_list(
    "recipe[apt]", 
    "recipe[build-essential]", 
    "recipe[chef-redis::source]", 
    "recipe[openssl]" 
) 

e quindi aggiungere questo ruolo alla Vagrantfile sezione di provisioning:

config.vm.provision :chef_solo do |chef| 
    chef.roles_path = "chef/roles" 
    chef.cookbooks_path = ["chef/site-cookbooks", "chef/cookbooks"] 
    chef.add_role "my-fancy-role" 
end 
2

Molte delle altre risposte postato qui sono suscettibili di causare avvertimenti sulla clonazione delle risorse.

Secondo il Apt cookbook documentation, si suppone di essere in grado di rendere questo accada impostando node['apt']['compile_time_update'] = true, tuttavia non ho mai avuto molta fortuna con questo approccio me.

Ecco quello che faccio, invece:

Questo caricherà la risorsa originale apt-get update e garantire che venga eseguito senza l'aggiunta di una voce duplicata per la raccolta di risorse. Questo farà sì che apt-get update per eseguire durante ogni chef eseguito durante la fase di compilazione:

# First include the apt::default recipe (so that `apt-get update` is added to the collection) 
include_recipe 'apt' 

# Then load the `apt-get update` resource from the collection and run it 
resources(execute: 'apt-get update').run_action(:run) 

Ovviamente, dovrete anche includere la apt libro di cucina nel vostro metadati.rb di file:

# ./metadata.rb 
depends 'apt'