46 votes

Comment puis-je obtenir que le 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 machine virtuelle publie une mise à jour d'apt-get 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.

Le résultat lorsque je fais une disposition vagabond 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
 

32voto

rtacconi Points 2868

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

 include apt
 

cela lancera la commande update.

21voto

Gabe Evans Points 664

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
 

10voto

jmontross Points 1882

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 les horodatages 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
 

8voto

Jake Points 472

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.

3voto

ashchristopher Points 3793

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X