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
Je semble avoir été capable de résoudre le problème en appliquant le correctif suivant:
https://github.com/wil/cookbooks/commit/a470a4f68602ec3bf3374830f4990a7e19e9de81
Vous pouvez inclure la recette apt au tout début:
include_recipe 'apt'
cela lancera la commande update.
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
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.
lancer apt-get-update à volonté lorsque d’autres recettes le nécessitent
installer le paquet update-notifier-common qui nous donne des horodatages sur les mises à jour
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
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.
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'
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
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)
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]"
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
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
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.