2012-07-08 7 views
26

Szef kuchni wydaje się przetwarzać zasoby w dziwnej kolejności, powodując awarię mojej instalacji. Mój główny przepis (mytardis-chef/site-cookbooks/recipes/default.rb) zaczyna się tak:Chef: Dlaczego zasoby w kroku "include_recipe" są pomijane?

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

mytardis-chef/cookbooks/build-essential/recipes/default.rb wygląda następująco:

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 

... (to starsza wersja https://github.com/opscode-cookbooks/build-essential/blob/master/recipes/default.rb)

W czasie wykonywania przez powodów nie rozumiem, ten zasadniczy przepis został załadowany, ale nie został wykonany:

[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 

Oznacza to, że przepis "niezbędny do zbudowania" jest "znaleziony" i "załadowany", ale jest to recepta postgresowa, która zostaje "przetworzona" jako pierwsza. A ponieważ build-essential (który instaluje kompilator C) nie był uruchamiany, ten ostatni nie działa.

Odpowiednia część mojego Vagrantfile wygląda następująco:

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 

byłem poprzednio używając nieco starszej wersji Chef (? Może 10.10.0) W tej wersji, build-essential również nie jest prowadzony , ale mytardis :: deps był. Teraz za pomocą Chef 10.12.0. Fizyczną maszyną jest OSX, VM to Ubuntu Lucid.

więc kilka pytań:

  1. Dlaczego build-essential nie jest "przetworzone"?
  2. Co to jest właściwy sposób? (Nie napisałem tych przepisów i rozumiem, że oni lub pracowali dla swojego autora.)
  3. Czy książki kucharskie strony internetowej i książki kucharskie mają funkcję "cieniowania"? Jest rzekomo przestarzała: http://tickets.opscode.com/browse/CHEF-2308 (Próbowałem stworzyć dowiązanie symboliczne pod książkami kucharskimi/mytardis/recipes/build-essential, ale bez radości).
+0

Możesz wstawić Chef :: Log.info ("Jestem w # {cookbook_name} :: # {recipe_name}") w pliku build-essential/recipes/default.rb i wydrukuje komunikat dziennika po wczytaniu Przepis. Plik utworzony przez procedurę obsługi wyjątku, podobnie jak "/var/chef/cache/failed-run-data.json", będzie miał cały zbiór zasobów wszystkich załadowanych zasobów, co może pomóc w debugowaniu, czy zasoby w przepis został dodany. – jtimberman

+0

Funkcja cieniowania książki kucharskiej polega na tym, że można zastąpić komponenty istniejące w książce kucharskiej, umieszczając je w książkach kucharskich, a nie tylko w oddzielnych książkach kucharskich w obu lokalizacjach. – jtimberman

+0

Czy byłeś w stanie to rozwiązać? –

Odpowiedz

40

Okazuje się, że jest to całkiem normalne (ale słabo udokumentowany) część jak Chef działa: kompiluje wszystko, a następnierozpoczyna bieg. Z wyjątkiem niektóre przepisy (jak PostgreSQL) przeskoczyć kolejkę faktycznie zainstalować w czasie kompilacji, używając kodu:

action :nothing 
end.run_action(:run) 

Rozwiązaniem jest, że wszystko co potrzebuje do uruchomienia przed Postgres wymaga również, aby to zrobić. Na szczęście nowsze wersje Build-essentials pozwalają na to. Ustawić atrybuty na roli, co następuje:

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

za oznaczenie tego jako odpowiedź. –

+1

Wpadłem na to dzisiaj z inną książką kucharską, która zależy od 'database :: postgresql', która z kolei zależy od' postgresql :: ruby'. Obecny przepis na 'postgresql :: ruby' instaluje' gem' pg', 'libpq' i' postgresql' w fazie ** Kompilacji ** w czasie pracy Chef'a. Robi to za pomocą 'run_action (: install)', jak wskazuje ta odpowiedź. – TrinitronX

+0

Istnieje inny sposób obejścia tego w niektórych przypadkach ... na przykład: Uruchomienie 'testu kuchni' na książce kucharskiej, która zawiera' postgresql :: ruby' może spowodować błędy apt z pamięci podręcznej starych pakietów. Aby to naprawić, możemy użyć DSL 'teraz' książki kucharskiej, aby wymusić' apt-get update' na początku Chefa w następujący sposób: 'include_recipe_now 'apt'' – TrinitronX

6

jeśli pisze książkę kucharską, dodać atrybut do pliku atrybuty:

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

Dzięki Colin powyżej.

+0

Czy jest to specyficzne dla przepisu build_essential? pracować w dowolnym miejscu? Czy jest to udokumentowane? –

+0

Steve, ta składnia jest użyteczna w każdym przepisie. węzeł jest odniesieniem "własnym" węzła szefa kuchni, domyślnie jest to ustawienie z własnym tytułem, które zostanie zastosowane w książce kucharskiej/przepisie na przepis, chyba że zostanie ponownie nadpisane. Pozostałe dwie opcje to build_essential specific. – toobulkeh

Powiązane problemy