Как заставить Chef запустить apt-get update перед запуском других рецептов? - PullRequest
45 голосов
/ 12 февраля 2012

Прямо сейчас у меня есть следующее в моем 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

Чтобы установить программное обеспечение, добавленное в мой recipe_list, мне нужно, чтобы виртуальная машина выдала apt-get update перед установкой другого программного обеспечения.

У меня сложилось впечатление, что это была одна из особенностей рецепта 'apt' - что он запустит обновление первым делом.

Выводкогда я делаю бродячее положение это:

[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

Ответы [ 12 ]

31 голосов
/ 13 августа 2013

Вы можете включить рецепт apt в самом начале:

include_recipe 'apt'

это запустит команду обновления.

21 голосов
/ 12 февраля 2012

apt-get update должен работать первым, как есть. Однако рецепт будет обновляться только один раз каждые 24 часа:

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 голосов
/ 28 февраля 2013

Есть три ресурса, которые прекрасно справятся с этой задачей в системе Ubuntu, особенно для меня, использующей 12.04 точную 64-битную версию.

  1. запускать apt-get-update по желанию, когда для других рецептов требуется

  2. установить общий пакет update-notifier, который дает нам метки времени для обновлений

  3. проверьте временные метки и периодически обновляйте.В этом случае ниже через 86400 секунд.

И вот эти три рецепта.

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
8 голосов
/ 02 октября 2013

Похоже, что последняя версия поваренной книги opscode apt позволяет запускать ее во время компиляции.

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

Пока apt запускается до других поваренных книг времени компиляции (например, postgres) в списке запуска, это должно работать.

3 голосов
/ 12 февраля 2012

Кажется, я смог решить проблему, применив следующий патч:

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

2 голосов
/ 07 апреля 2016

Многие другие ответы, опубликованные здесь, могут вызвать предупреждения о клонировании ресурсов.

Согласно документации Apt для поваренной книги , вы должны иметь возможность сделать это, установив node['apt']['compile_time_update'] = true, однако Самому мне никогда не везло с таким подходом .

Вот что я делаю вместо этого:

Это загрузит исходный ресурс apt-get update и обеспечит его запуск без добавления повторяющейся записи в коллекцию ресурсов. Это заставит apt-get update выполняться во время каждого запуска Chef на этапе компиляции:

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

Очевидно, вы также захотите включить поваренную книгу apt в файл metadata.rb :

# ./metadata.rb
depends 'apt'
1 голос
/ 15 марта 2014

Чтобы запустить обновление apt-get во время компиляции, выполните:

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 голос
/ 11 сентября 2013

Без исправления это общий подход к проблеме, который будет обновляться при каждом запуске:

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

Возможно, стоит подумать, что такой запуск при каждом запуске связывает немалосистемные ресурсы около 30 секунд;вы можете захотеть иметь специальный рецепт с именем recipe :: update_apt, который вы запускали через cron или через какое-то другое событие, например

chef-client -o "recipe[yourrecipe::update_apt]"
1 голос
/ 29 февраля 2012

Самый простой и прямой способ решения проблемы - применить следующий патч (h / t @ashchristopher):

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

Проблема в том, что postgresql::clientrecipe запускает действие установки для ресурсов пакета в postgresql / recipes / client.rb: 39 и 44 в время компиляции , а не время выполнения, как обычно (ч / т Тим ​​Поттер), заставляя их проверяться шеф-поваром (и, таким образом, устанавливаться), прежде чем что-либо еще будет запущено.

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)

Я полагаю, что это сделано в службе postgres database cookbook провайдер, который зависит от поваренной книги postgresql и зависит от того, установлен ли гем pg до его компиляции.Применение вышеуказанного патча может сломать поваренную книгу database.

Другим альтернативным решением было бы создать рецепт, который запускается apt-get update также во время компиляции и поместить его в run_list до postgresqlповаренная книга.В простейшей форме это может быть что-то вроде:

execute "apt-get update" do
  action :nothing
end.run_action(:install)
0 голосов
/ 12 октября 2018

Для последней версии Chef, то есть для версии 14. Вы также можете использовать https://docs.chef.io/resource_apt_update.html

apt_update

В приведенном ниже выводе был мой эксперимент по запуску этого ресурса для chef_14.5.33 в локальнойрежим (ноль):

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
...