it-swarm.com.de

Wie kann ich Chef dazu bringen, apt-get update auszuführen, bevor andere Rezepte ausgeführt werden?

Im Moment habe ich folgendes in meiner 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

Um die Software zu installieren, die zu meiner Rezepturliste hinzugefügt wurde, muss ich vor dem Installieren der anderen Software die Option VM einrichten, um ein apt-get Update auszuführen.

Ich hatte den Eindruck, dass dies eines der Features des 'apt' Rezeptes ist - dass es das Update als erstes ausführen wird.

Die Ausgabe, wenn ich eine vagrant-Bestimmung mache ist

[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
45
ashchristopher

Ich habe das Problem anscheinend mit dem folgenden Patch lösen können:

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

3
ashchristopher

Sie können das passende Rezept ganz am Anfang einfügen:

include_recipe 'apt'

dadurch wird der Aktualisierungsbefehl ausgeführt.

31
rtacconi

apt-get update sollte zuerst so laufen, wie Sie es haben. Das Rezept wird jedoch nur alle 24 Stunden aktualisiert:

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
Gabe Evans

Es gibt drei Ressourcen, die dies auf einem Ubuntu-System gut tun werden, insbesondere auf 12.04 genau 64 Bit von mir. 

  1. führen Sie apt-get-update nach Belieben aus, wenn andere Rezepte erforderlich sind 

  2. installieren Sie das Update-Notifier-Common-Paket, das uns Zeitstempel für Updates gibt

  3. Überprüfen Sie die Zeitstempel und aktualisieren Sie sie regelmäßig. In diesem Fall unten nach 86400 Sekunden. 

Und hier sind diese drei Rezepte.

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
jmontross

Es sieht so aus, als könnten Sie es mit der neuesten Version des opscode apt-Kochbuchs zur Kompilierzeit ausführen.

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

Solange apt vor anderen Compiletime-Kochbüchern (wie Postgres) in der Ausführungsliste ausgeführt wird, sollte dies funktionieren.

8
Jake

Viele der anderen Antworten, die hier veröffentlicht werden, führen wahrscheinlich zu Warnungen über das Klonen von Ressourcen.

Laut der Dokumentation des Apt-Kochbuchs sollte dies in der Lage sein, node['apt']['compile_time_update'] = true einzustellen, jedoch Ich hatte mit dieser Vorgehensweise selbst nie viel Glück.

Ich mache stattdessen Folgendes:

Dadurch wird die ursprüngliche apt-get update-Ressource geladen und sichergestellt, dass sie ausgeführt wird, ohne dass ein doppelter Eintrag zur Ressourcensammlung hinzugefügt wird. Dies führt dazu, dass apt-get update während jedes Cheflaufs während der Kompilierungsphase ausgeführt wird:

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

Natürlich möchten Sie auch das apt-Kochbuch in Ihre metadata.rb -Datei aufnehmen:

# ./metadata.rb
depends 'apt'
2
Eric Herot

Führen Sie Folgendes aus, um apt-get update zur Kompilierzeit auszuführen:

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

e.run_action(:run)

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

1
Rudger

Der einfachste und direkteste Weg, um das Problem zu lösen, ist das folgende Patch (h/t @ashchristopher) anzuwenden:

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

Das Problem ist, dass das postgresql::client-Rezept die Installationsaktion für die Paketressourcen unter postgresql/recipes/client.rb: 39 und 44 at Kompilierzeit ausführt und nicht wie üblich zur Laufzeit (h/t Tim Potter), wodurch sie vom Chef bewertet (und somit installiert) werden, bevor etwas anderes ausgeführt wird.

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)

Ich glaube, dies geschieht im Dienste des database cookbook - Postgres-Providers, der vom postgresql-Kochbuch abhängt und von der Installation des pg-Gems abhängt, bevor er kompiliert wird. Durch Anwenden des obigen Patches kann das database-Kochbuch beschädigt werden.

Die andere alternative Lösung wäre, ein Rezept zu erstellen, das apt-get update auch zur Kompilierzeit ausführt, und es in Ihrem run_list vor dem postgresql-Kochbuch abzulegen. In seiner einfachsten Form wäre das wahrscheinlich so:

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

Ohne Patches ist dies ein generischer Ansatz für das Problem, das bei jedem Lauf aktualisiert wird:

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

Es kann sich lohnen, zu berücksichtigen, dass ein solcher Lauf bei jedem Durchlauf für ungefähr 30 Sekunden einiges an Systemressourcen bindet. Möglicherweise möchten Sie ein spezielles Rezept mit dem Namen recipe :: update_apt haben, das Sie über cron oder über ein anderes Ereignis ausgeführt haben, d. h.

chef-client -o "recipe[yourrecipe::update_apt]"
1
Stephan

Für die aktuelle Chef-Version, d. H. Version 14. .. Sie können auch https://docs.chef.io/resource_apt_update.html

apt_update

Die folgende Ausgabe war mein Experiment, in dem diese Ressource für chef_14.5.33 im lokalen Modus (Null) ausgeführt wurde:

curl -O https://packages.chef.io/files/stable/chef/14.5.33/ubuntu/18.04/chef_14.5.33-1_AMD64.de
Sudo dpkg -i chef_14.5.33-1_AMD64.deb
mkdir -p cookbooks/hello/recipes/ && echo "apt_update" > cookbooks/hello/recipes/default.rb

Sudo sh -c 'chef-client -z -o hello'
[2018-10-12T10:25:30+00:00] WARN: No config file found or specified on command line, using command line options.
Starting Chef Client, version 14.5.33
[2018-10-12T10:25:32+00:00] WARN: Run List override has been provided.
[2018-10-12T10:25:32+00:00] WARN: Run List override has been provided.
[2018-10-12T10:25:32+00:00] WARN: Original Run List: []
[2018-10-12T10:25:32+00:00] WARN: Original Run List: []
[2018-10-12T10:25:32+00:00] WARN: Overridden Run List: [recipe[hello]]
[2018-10-12T10:25:32+00:00] WARN: Overridden Run List: [recipe[hello]]
resolving cookbooks for run list: ["hello"]
Synchronizing Cookbooks:
  - hello (0.0.0)
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 1 resources
Recipe: hello::default
  * apt_update[] action periodic (up to date)
[2018-10-12T10:25:32+00:00] WARN: Skipping final node save because override_runlist was given
[2018-10-12T10:25:32+00:00] WARN: Skipping final node save because override_runlist was given

Running handlers:
Running handlers complete
Chef Client finished, 0/1 resources updated in 01 seconds
0
zdk

nur eine freundliche Erinnerung daran, dass das Hinzufügen all dieser Rezepte innerhalb der Vagrant-Bestimmung schnell unüberschaubar wird. 

Ein besseres Muster ist das Erstellen einer Kochrolle 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]"
)

Fügen Sie dann diese Rolle zum Abschnitt Vagrantfile-Bereitstellung hinzu:

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
lurscher

Ich hatte die gleiche Situation, und in meinem Fall war apt das Kochbuch das zweite nach dem, bei dem die Installation des Pakets genannt wurde. Lass es einfach hier, damit vielleicht jemand davon profitiert. Überprüfen Sie die Reihenfolge der Kochbücher in Ihrer Runlist, Rolle oder wo auch immer.

0
kaboom