Comment puis-je obtenir de Chef d'exécuter apt-get update avant d'exécuter d'autres recettes
Droit maintenant, j'ai la suite dans ma 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
Afin d'installer le logiciel ajouté à mon recipe_list, j'ai besoin d'obtenir la VM à émettre un apt-get update avant d'installer les autres logiciels.
J'étais sous l'impression que c'était l'une des caractéristiques de la " apt " recette qu'il irait à la mise à jour de la première chose.
La sortie, quand je fais un vagrant provision 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
- Le Chef de 12,7 introduit un natif
apt_update
de ressources ce qui rend la plupart de ces réponses obsolètes. docs.chef.io/resource_apt_update.html
Vous devez vous connecter pour publier un commentaire.
Vous pouvez inclure l'apt recette dans le tout début:
cela permettra d'exécuter la commande de mise à jour.
include_recipe 'apt'
apt-get update
doit être en cours d'exécution d'abord la façon dont vous l'avez. Cependant, la recette n'est mis à jour toutes les 24 heures:apt-get update
lorsque l'horodatage du fichier n'existe pas déjà, qu'il ne le fera pas à l'origine. Il me semble la bonne logique serait!File.exists?(...) || File.mtime ...
Il y a trois ressources qui va le faire bien sur un système ubuntu, plus précisément en cours d'utilisation sur 12.04 precise 64 bits par moi.
exécuter apt-get-mise à jour à volonté lorsque d'autres recettes nécessitent
installer update-notifier-common package qui nous donne la date et l'heure sur les mises à jour
vérifier les horodateurs et mise à jour périodiquement. Dans ce cas ci-dessous après 86400 secondes.
Et voici ces trois recettes.
Il ressemble à la version la plus récente de la opscode apt livre de cuisine vous permettre de l'exécuter au moment de la compilation.
Tant que apt est exécuté avant que d'autres compile-time livres de cuisine (comme postgres) dans la liste en cours, cela devrait fonctionner.
Me semble que j'ai été en mesure de résoudre le problème en appliquant le correctif suivant:
https://github.com/wil/cookbooks/commit/a470a4f68602ec3bf3374830f4990a7e19e9de81
action :nothing
etrun_action(:install)
. Cela semble d'installer le paquet lors de la phase de compilation du chef-d'exécution du client au lieu de l'exécution de la scène. Voir [wiki.opscode.com/display/chef/Anatomy+à+un+Chef+Exécuter] pour plus de détails. L'ajout derecipe[apt]
à l'avant d'un nœud de la liste en cours qui doit normalement fonctionnerapt-get install
comme première action.Beaucoup d'autres réponses postées ici sont susceptibles de causer des avertissements à propos des ressources de clonage.
Selon la Apt cookbook documentation, vous êtes censé être en mesure de faire ceci se produire par la mise en
node['apt']['compile_time_update'] = true
, cependant je n'ai jamais eu beaucoup de chance avec cette approche me.Voici ce que je fais à la place:
Cela va charger l'original
apt-get update
de ressources et de s'assurer qu'il fonctionne sans l'ajout d'une double entrée pour la collecte de ressources. Ce sera la cause deapt-get update
à exécuter au cours de chaque Chef d'exécuter au cours de la phase de compilation:Évidemment, vous aurez également inclure les
apt
livre de recettes et votre métadonnées.rb fichier:La plus simple et la plus directe pour résoudre le problème est d'appliquer le patch suivant (h/t @ashchristopher):
https://github.com/wil/cookbooks/commit/a470a4f68602ec3bf3374830f4990a7e19e9de81
Le problème est que le
postgresql::client
recette exécute l'installation d'action sur l'emballage des ressources à postgresql/recettes/client.rb:39 et 44 à au moment de la compilation plutôt que de courir comme normal (h/t Tim Potter), les obligeant à être évalué par le Chef (et donc installé) avant tout le reste fonctionne.Je crois que c'est accompli au service de la
base
livre de recettess'postgres fournisseur, qui dépend de lapostgresql
livre de cuisine et s'appuie sur lepg
gem être installé avant de compiler. Appliquer le correctif ci-dessus peut briser ledatabase
livre de cuisine.L'autre alternative serait de créer une recette qui fonctionne
apt-get update
également au moment de la compilation et de la mettre dans votrerun_list
avant lapostgresql
livre de cuisine. Dans sa forme la plus simple ce serait probablement quelque chose comme:Sans les patchs, c'est une approche générique pour le problème de mise à jour sur chaque course:
Il peut être utile de considérer qu'une telle course, sur chaque course, des liens un peu juste des ressources système pour environ 30 secondes, vous voudrez peut-être avoir une recette spéciale nommée recette::update_apt que vous avez exécuté par cron ou par tout autre événement, par exemple
D'exécuter apt-get update au moment de la compilation, n':
vérifier https://wiki.opscode.com/display/chef/Evaluate+et+Run+Ressources+à+la Compilation+de Temps
J'ai eu la même situation, et dans mon cas, apt livre de cuisine, a été le deuxième après celui qui a appelé à l'installation du paquet. Simplement laisser ici, donc peut-être que quelqu'un va en bénéficier. Vérifier l'ordre des livres de cuisine dans votre liste, de rôle ou n'importe où ailleurs.
juste un rappel amical que l'ajout de toutes ces recettes à l'intérieur de la vagrant provision peut rapidement devenir ingérable.
Un meilleur modèle est de créer un chef rôle
chef/my-fancy-role.rb
Puis ajouter ce rôle à la
Vagrantfile
section provisioning:Pour le dernier Chef de la version, j'.e de la version 14.
Vous pouvez également utiliser https://docs.chef.io/resource_apt_update.html
apt_update
Le dessous de sortie a été mon expérience de l'exécution de cette ressource pour chef_14.5.33 en mode local (zéro):