web-dev-qa-db-fra.com

Comment puis-je obtenir que Chef exécute apt-get update avant d'exécuter d'autres recettes

Actuellement, j'ai les éléments suivants dans mon fichier Vagrant:

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

Pour installer le logiciel ajouté à ma liste de recettes, je dois faire en sorte que la VM émette un apt-get update avant d'installer l'autre logiciel.

J'avais l'impression que c'était l'une des caractéristiques de la recette 'apt' - qu'elle exécuterait la mise à jour en premier.

La sortie lorsque je fais une provision errant est:

[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

Je semble avoir été capable de résoudre le problème en appliquant le correctif suivant:

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

3
ashchristopher

Vous pouvez inclure la recette apt au tout début:

include_recipe 'apt'

cela lancera la commande update.

31
rtacconi

apt-get update devrait fonctionner en premier comme vous l'avez. Cependant, la recette ne sera mise à jour qu'une fois toutes les 24 heures:

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

Il existe trois ressources qui le feront bien sur un système Ubuntu, spécifiquement utilisé par 12.04 bits 64 bits précis par moi. 

  1. lancer apt-get-update à volonté lorsque d’autres recettes le nécessitent 

  2. installer le paquet update-notifier-common qui nous donne des horodatages sur les mises à jour

  3. vérifiez l'horodatage et mettez à jour périodiquement. Dans ce cas ci-dessous après 86400 secondes. 

Et voici ces trois recettes.

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

Il semble que la dernière version du livre de recettes opscode apt vous permette de l’exécuter au moment de la compilation.

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

Tant que apt est exécuté avant les autres livres de recettes compiletime (comme postgres) dans la liste d'exécution, cela devrait fonctionner.

8
Jake

Beaucoup des autres réponses publiées ici sont susceptibles de générer des avertissements sur le clonage des ressources.

Selon la documentation du livre de recettes Apt , vous êtes supposé pouvoir y parvenir en définissant node['apt']['compile_time_update'] = true, cependant je n'ai jamais eu beaucoup de chance avec cette approche moi-même.

Voici ce que je fais à la place:

Cela chargera la ressource apt-get update d'origine et garantira son exécution sans ajouter une entrée dupliquée à la collection de ressources. Ceci entraînera l'exécution de apt-get update lors de chaque exécution de Chef pendant la phase de compilation:

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

Évidemment, vous voudrez également inclure le livre de recettes apt dans votre fichier metadata.rb:

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

Pour exécuter apt-get update au moment de la compilation, faites:

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

Le moyen le plus simple et le plus direct de résoudre le problème consiste à appliquer le correctif suivant (h/t @ashchristopher):

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

Le problème est que la recette postgresql::client exécute l'action d'installation sur les ressources du package à postgresql/recipes/client.rb: 39 et 44 à à la compilation plutôt qu'à l'exécution, comme d'habitude (h/t Tim Potter), ce qui entraîne leur évaluation par Chef (et donc leur installation) avant toute autre exécution.

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)

Je crois que cela est fait au service du fournisseur postgres de database cookbook , qui dépend du livre de recettes postgresql et du montage de la gemme pg avant sa compilation. L’application du correctif ci-dessus peut endommager le livre de recettes database.

L’autre solution consiste à créer une recette qui exécute apt-get update également au moment de la compilation et à la placer dans votre run_list avant le livre de recettes postgresql. Dans sa forme la plus simple, cela ressemblerait probablement à:

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

Sans correction, il s'agit d'une approche générique du problème qui sera mise à jour à chaque exécution:

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

Cela vaut la peine de considérer qu’une telle exécution, à chaque exécution, accapare une bonne quantité de ressources système pendant environ 30 secondes; vous voudrez peut-être avoir une recette spéciale nommée recipe :: update_apt que vous avez exécutée via cron ou un autre événement, par exemple i.e.

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

Pour la version récente de Chef, c'est-à-dire la version 14, vous pouvez également utiliser https://docs.chef.io/resource_apt_update.html

apt_update

La sortie ci-dessous correspond à mon expérience d'utilisation de cette ressource pour chef_14.5.33 en mode local (zéro):

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

juste un rappel amical que l'ajout de toutes ces recettes à la disposition du vagabond peut rapidement devenir ingérable. 

Un meilleur modèle consiste à créer un rôle de chef 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]"
)

Et ajoutez ensuite ce rôle à la section de provisionage 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
lurscher

J'ai eu la même situation, et dans mon cas, apt cookbook était le deuxième après celui qui a appelé l'installation du paquet. Il suffit de le laisser ici pour que peut-être quelqu'un en profite. Vérifiez l'ordre des livres de recettes dans votre liste de sélection, votre rôle ou ailleurs.

0
kaboom