2012-07-08 9 views
26

Lo chef sembra elaborare le risorse in uno strano ordine, causando il fallimento della mia build. La mia ricetta principale (mytardis-chef/site-cookbooks/recipes/default.rb) inizia così:Chef: perché le risorse in un passaggio "include_recipe" vengono saltate?

include_recipe "build-essential" 
include_recipe "mytardis::deps" 
include_recipe "mytardis::nginx" 
include_recipe "mytardis::postgresql" 

mytardis-chef/cookbooks/build-essential/recipes/default.rb assomiglia a questo:

case node['platform'] 
when "ubuntu","debian" 
    %w{build-essential binutils-doc}.each do |pkg| 
    package pkg do 
     action :install 
    end 
    end 
when "centos","redhat","fedora","scientific" 
    %w{gcc gcc-c++ kernel-devel make}.each do |pkg| 
    package pkg do 
     action :install 
    end 
    end 
end 

... (si tratta di una versione precedente di https://github.com/opscode-cookbooks/build-essential/blob/master/recipes/default.rb)

In fase di esecuzione, per ragioni che non capisco, questa ricetta build-essential viene caricata ma non eseguita:

[default] Waiting for VM to boot. This can take a few minutes. 
[default] VM booted and ready for use! 
[default] Mounting shared folders... 
[default] -- v-root: /vagrant 
[default] -- v-csr-3: /tmp/vagrant-chef-1/chef-solo-3/roles 
[default] -- v-csc-2: /tmp/vagrant-chef-1/chef-solo-2/cookbooks 
[default] -- v-csc-1: /tmp/vagrant-chef-1/chef-solo-1/cookbooks 
[default] -- v-csdb-4: /tmp/vagrant-chef-1/chef-solo-4/data_bags 
[default] Running provisioner: Vagrant::Provisioners::ChefSolo... 
[default] Generating chef JSON and uploading... 
[default] Running chef-solo... 
[Sun, 08 Jul 2012 05:14:32 +0200] INFO: *** Chef 10.12.0 *** 
[Sun, 08 Jul 2012 05:14:32 +0200] DEBUG: Building node object for lucid32 
[Sun, 08 Jul 2012 05:14:32 +0200] DEBUG: Extracting run list from JSON attributes provided on command line 
[Sun, 08 Jul 2012 05:14:32 +0200] INFO: Setting the run_list to ["recipe[mytardis]"] from JSON 
[Sun, 08 Jul 2012 05:14:32 +0200] DEBUG: Applying attributes from json file 
[Sun, 08 Jul 2012 05:14:32 +0200] DEBUG: Platform is ubuntu version 10.04 
[Sun, 08 Jul 2012 05:14:32 +0200] INFO: Run List is [recipe[mytardis]] 
[Sun, 08 Jul 2012 05:14:32 +0200] INFO: Run List expands to [mytardis] 
[Sun, 08 Jul 2012 05:14:32 +0200] INFO: Starting Chef Run for lucid32 
[Sun, 08 Jul 2012 05:14:32 +0200] INFO: Running start handlers 
[Sun, 08 Jul 2012 05:14:32 +0200] INFO: Start handlers complete. 
... 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: Loading Recipe mytardis via include_recipe 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: Found recipe default in cookbook mytardis 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: Loading Recipe build-essential via include_recipe 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: Found recipe default in cookbook build-essential 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: Loading Recipe mytardis::deps via include_recipe 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: Found recipe deps in cookbook mytardis 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: Loading Recipe mytardis::nginx via include_recipe 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: Found recipe nginx in cookbook mytardis 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: Loading Recipe iptables via include_recipe 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: Found recipe default in cookbook iptables 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: Loading Recipe mytardis::postgresql via include_recipe 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: Found recipe postgresql in cookbook mytardis 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: Loading Recipe postgresql::server via include_recipe 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: Found recipe server in cookbook postgresql 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: Loading Recipe postgresql::client via include_recipe 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: Found recipe client in cookbook postgresql 
[Sun, 08 Jul 2012 05:14:33 +0200] INFO: Processing package[postgresql-client] action install (postgresql::client line 37) 
[Sun, 08 Jul 2012 05:14:33 +0200] DEBUG: package[postgresql-client] checking package status for postgresql-client 
.... 
[Sun, 08 Jul 2012 05:14:45 +0200] ERROR: gem_package[pg] (postgresql::client line 42) has had an error 
. 
make 
sh: make: not found 

Ovvero, la ricetta build-essential è "found" e "loaded", ma è la ricetta postgres che viene "elaborata" per prima. E poiché build-essential (che installa il compilatore C) non è stato eseguito, quest'ultimo fallisce.

La parte rilevante della mia Vagrantfile assomiglia a questo:

config.vm.provision :chef_solo do |chef| 
    chef.log_level = :debug 
    chef.cookbooks_path = ["mytardis-chef/site-cookbooks", "mytardis-chef/cookbooks"] 
    chef.roles_path = "mytardis-chef/roles" 
    chef.data_bags_path = "mytardis-chef/data_bags" 
    chef.add_recipe "mytardis"  
    end 

ero in precedenza usando una versione leggermente precedente di Chef (? Forse 10.10.0) In questa versione, build-essential era anche non in esecuzione , ma mytardis :: deps era. Ora utilizzo Chef 10.12.0. La macchina fisica è OSX, VM è Ubuntu Lucid.

Così, alcune domande:

  1. Perché è build-essential non essere "trattati"?
  2. Qual è il modo giusto per farlo? (Non ho scritto queste ricette, e ho capito che hanno fatto o hanno lavorato per il loro autore.)
  3. Se la funzione di ombreggiatura dei libri di cucina e dei libri di cucina funziona ancora? È presumibilmente deprecato: http://tickets.opscode.com/browse/CHEF-2308 (ho provato a creare un collegamento simbolico da siti-libri di cucina/mytardis/ricette/build-essential ma niente gioia).
+0

È possibile inserire Chef :: Log.info ("Sono in # {cookbook_name} :: # {recipe_name}") in build-essential/recipes/default.rb e stamperà il messaggio di registro quando carica il ricetta. Il file creato dal gestore delle eccezioni, qualcosa come "/var/chef/cache/failed-run-data.json" avrà anche l'intera raccolta di risorse di tutte le risorse che ha caricato, il che può aiutare nel debugging delle risorse nel la ricetta è stata aggiunta. – jtimberman

+0

La funzione di ombreggiatura dei ricettari è quella in cui è possibile sovrascrivere i componenti che esistono in un libro di cucina inserendoli in libri di cucina del sito, non semplicemente con libri di cucina separati in entrambe le posizioni. – jtimberman

+0

Sei riuscito a risolvere questo? –

risposta

40

Si scopre questa è una parte abbastanza normale (ma sotto-documentato) di come funziona Chef: si compila tutto, e poi inizia in esecuzione. Tranne alcune ricette (come Postgres) saltare la coda per l'installazione in realtà al momento della compilazione, utilizzando il codice in questo modo:

action :nothing 
end.run_action(:run) 

La soluzione è che tutto ciò che deve essere eseguito prima di Postgres ha anche bisogno di fare questo. Fortunatamente, le nuove versioni di Build-essentials consentono questo. È possibile impostare gli attributi per un ruolo come segue:

name "myapp" 
run_list(
    "recipe[build-essential]", 
    "recipe[myapp]" 
) 
default_attributes(
    "build_essential" => { 
    "compiletime" => true 
    } 
) 
+1

considera di contrassegnarlo come una risposta. –

+1

Mi sono imbattuto in questo oggi con un altro libro di cucina che dipende da 'database :: postgresql', che a sua volta dipende da' postgresql :: ruby'. L'attuale ricetta per 'postgresql :: ruby' installa la gemma' pg', 'libpq' e' postgresql' nella fase ** Compilazione ** della corsa Chef. Lo fa usando 'run_action (: install)' come indicato da questa risposta. – TrinitronX

+0

C'è un altro modo per ovviare a questo problema in alcuni casi ... ad esempio: l'esecuzione di 'kitchen test' su un libro di cucina che include' postgresql :: ruby' può provocare errori apt da una cache di pacchetti non aggiornata. Per risolvere questo problema, possiamo usare il DSL del libro di cucina 'now' per forzare un' apt-get update' all'inizio dell'esecuzione di Chef in questo modo: 'include_recipe_now 'apt'' – TrinitronX

6

se la scrittura di un libro di cucina, aggiungere l'attributo su file gli attributi:

node.default['build_essential']['compiletime'] = true 

Grazie a Colin sopra.

+0

È specifico per la ricetta build_essential o lo fa lavoro da qualche parte? È documentato? –

+0

Steve, quella sintassi è utilizzabile in qualsiasi ricetta. il nodo è il riferimento "auto" di un nodo Chef, l'impostazione predefinita è l'impostazione auto-denominata che viene applicata al ricettario/uso della ricetta, a meno che non venga sovrascritta. Le altre due opzioni sono specifiche build_essential. – toobulkeh