Jak mogę zmusić kucharza do uruchomienia apt-get update przed uruchomieniem innych przepisów

W tej chwili mam w moim Vagrantfile:

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

Aby zainstalować oprogramowanie dodane do mojej recipe_list, muszę poprosić maszynę wirtualną o wydanie apt-get update przed zainstalowaniem innego oprogramowania.

Miałem wrażenie, że jest to jedna z cech receptury " apt " - że najpierw uruchomi aktualizację.

Wyjście gdy wykonam przepis vagrant to:

[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
Author: codeforester, 2012-02-12

11 answers

Możesz dołączyć przepis apt na samym początku:

include_recipe 'apt'

Spowoduje uruchomienie polecenia update.

 31
Author: rtacconi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-02 10:21:18

apt-get update powinieneś zacząć biegać tak, jak ty to masz. Jednak przepis będzie aktualizowany tylko raz na 24 godziny:

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
 21
Author: Gabe Evans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-12 16:36:25

Są trzy zasoby, które zrobią to ładnie na systemie ubuntu, konkretnie w użyciu na 12.04 dokładnie 64 bit przez mnie.

  1. Uruchom apt-get-update do woli, gdy inne przepisy wymagają

  2. Install update-notifier-wspólny pakiet, który daje nam znaczniki czasu na aktualizacjach

  3. Sprawdzaj znaczniki czasu i okresowo Aktualizuj. W tym przypadku poniżej po 86400 sekund.

A oto te trzy przepisy.
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
 10
Author: jmontross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-09 01:01:01

Wygląda na to, że najnowsza wersja opscode apt cookbook pozwala uruchomić ją podczas kompilacji.

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

Tak długo, jak apt jest uruchamiany przed innymi podręcznikami kompilacji (takimi jak postgres) na liście run, powinno to działać.

 8
Author: Jake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-16 13:46:48

Wydaje mi się, że udało mi się rozwiązać problem poprzez zastosowanie następującej łatki:

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

 3
Author: ashchristopher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-12 17:07:00

Wiele innych odpowiedzi zamieszczonych tutaj może powodować ostrzeżenia o klonowaniu zasobów.

Zgodnie z Apt cookbook documentation , powinieneś być w stanie to zrobić, ustawiając node['apt']['compile_time_update'] = true, jednak sam nigdy nie miałem szczęścia z tym podejściem.

Oto co robię zamiast tego:

Spowoduje to załadowanie oryginalnego zasobu apt-get update i upewni się, że działa bez dodawania zduplikowanego wpisu do zbioru zasobów. Spowoduje to apt-get update do wykonania podczas każdego uruchomienia Chef podczas fazy kompilacji:

# 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)

Oczywiście, będziesz chciał również dołączyć apt książkę kucharską do metadanych .RB plik:

# ./metadata.rb
depends 'apt'
 2
Author: Eric Herot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-06 23:16:22

Najprostszym i najbardziej bezpośrednim sposobem rozwiązania problemu jest zastosowanie następującej łatki (h/t @ashchristopher):

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

Problem polega na tym, że przepis postgresql::client uruchamia akcję instalacji na zasobach pakietu w postgresql / recipes / client.rb: 39 i 44 w czas kompilacji, a nie czas uruchamiania jak zwykle (H/T Tim Potter), co powoduje, że są one oceniane przez Szefa Kuchni (i tym samym zainstalowany) zanim cokolwiek innego działa.

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)
[[10]}wierzę, że odbywa się to w służbie database cookbook jest dostawcą postgres, który zależy od postgresql cookbook i polega na zainstalowaniu gem pg przed kompilacją. Zastosowanie powyższej łatki może złamać database książkę kucharską.

Innym alternatywnym rozwiązaniem byłoby stworzenie przepisu, który działa apt-get update również w czasie kompilacji i umieścić go w run_list przed postgresql książka kucharska. W najprostszym forma, która prawdopodobnie byłaby czymś w stylu:

execute "apt-get update" do
  action :nothing
end.run_action(:install)
 1
Author: Kevin Riggle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-29 07:27:30

Bez patchowania, jest to ogólne podejście do problemu, które będzie aktualizowane przy każdym uruchomieniu:

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

Być może warto wziąć pod uwagę, że takie uruchomienie, przy każdym uruchomieniu, wiąże sporą część zasobów systemowych przez około 30 sekund; możesz chcieć mieć specjalną recepturę o nazwie recipe::update_apt, która została uruchomiona przez cron lub przez inne zdarzenie, np.

chef-client -o "recipe[yourrecipe::update_apt]"
 1
Author: Stephan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-10 21:22:13

Aby uruchomić apt-get update podczas kompilacji, wykonaj:

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

e.run_action(:run)

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

 1
Author: Rudger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-15 12:56:03

Miałem taką samą sytuację i w moim przypadku apt cookbook był drugi po tym, który wywołał instalację pakietu. Zostawiam to tutaj, żeby ktoś mógł na tym skorzystać. Sprawdź kolejność książek kucharskich na swojej liście Run, roli lub gdziekolwiek indziej.

 0
Author: kaboom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-04 09:21:54

Tylko przyjazne przypomnienie, że dodanie tych wszystkich przepisów wewnątrz przepisu włóczęgi może szybko stać się niewykonalne.

Lepszym wzorcem jest stworzenie roli kucharza 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]"
)

A następnie dodać tę rolę do sekcji Vagrantfile:

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
 0
Author: lurscher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-27 20:30:43