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
11 answers
Możesz dołączyć przepis apt na samym początku:
include_recipe 'apt'
Spowoduje uruchomienie polecenia update.
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
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.
-
Uruchom apt-get-update do woli, gdy inne przepisy wymagają
-
Install update-notifier-wspólny pakiet, który daje nam znaczniki czasu na aktualizacjach
Sprawdzaj znaczniki czasu i okresowo Aktualizuj. W tym przypadku poniżej po 86400 sekund.
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
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ć.
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
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'
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)
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]"
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
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.
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
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