如何让 Chef 在运行其他食谱之前运行 apt-get update

发布于 2025-01-04 17:39:32 字数 2051 浏览 1 评论 0原文

现在,我的 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

Right now I have the following in my 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

In order to install the software added to my recipe_list, I need to get the VM to issue an apt-get update before installing the other software.

I was under the impression that this was one of the features of the 'apt' recipe - that it would run the update first thing.

The output when I do a vagrant provision is:

[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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(12

嘿哥们儿 2025-01-11 17:39:32

您可以在开头包含 apt 配方:

include_recipe 'apt'

这将运行更新命令。

You can include the apt recipe in the very beginning:

include_recipe 'apt'

this will run the update command.

℡寂寞咖啡 2025-01-11 17:39:32

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

apt-get update should be running first the way you have it. However, the recipe will only update once every 24 hours:

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
朮生 2025-01-11 17:39:32

有三个资源可以在 ubuntu 系统上很好地完成此操作,特别是我在 12.04 精确 64 位上使用的资源。

  1. 当其他食谱需要时,随意运行 apt-get-update

  2. 安装 update-notifier-common 包,为我们提供更新时间戳

  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

There are three resources that will do this nicely on an ubuntu system, specifically in use on 12.04 precise 64 bit by me.

  1. run apt-get-update at will when other recipes require

  2. install update-notifier-common package that gives us timestamps on updates

  3. check the timestamps and update periodically. In this case below after 86400 seconds.

And here's those three recipes.

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
岁月静好 2025-01-11 17:39:32

看起来最新版本的 opscode apt Cookbook 允许您在编译时运行它。

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

只要 apt 在运行列表中的其他编译时说明书(例如 postgres)之前运行,就应该可以工作。

It looks like the latest version of the opscode apt cookbook allow you to run it at compile time.

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

As long as apt is run before other compiletime cookbooks (like postgres) in the run list, this should work.

相权↑美人 2025-01-11 17:39:32

此处发布的许多其他答案可能会引起有关资源克隆的警告。

根据Apt Cookbook文档,你应该可以通过设置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-get update 包含在您的元数据中.rb 文件:

# ./metadata.rb
depends 'apt'

A lot of the other answers posted here are likely to cause warnings about resource cloning.

According to the Apt cookbook documentation, you're supposed to be able to make this happen by setting node['apt']['compile_time_update'] = true, however I have never had much luck with this approach myself.

Here's what I do instead:

This will load the original apt-get update resource and ensure that it runs without adding a duplicate entry to the resource collection. This will cause apt-get update to execute during every Chef run during the compile phase:

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

Obviously, you'll also want to include the apt cookbook in your metadata.rb file:

# ./metadata.rb
depends 'apt'
她如夕阳 2025-01-11 17:39:32

我似乎能够通过应用以下补丁来解决该问题:

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

I seem to have been able to solve the issue by applying the following patch:

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

烟花易冷人易散 2025-01-11 17:39:32

解决问题最简单、最直接的方法是应用以下补丁(h/t @ashchristopher):

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

问题是 postgresql::client 配方对包资源运行安装操作在 postgresql/recipes/client.rb:39 和 44在 编译时而不是像正常那样运行时(h/ t Tim Potter),导致它们在其他任何东西运行之前由 Chef 评估(并因此安装)。

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)

我相信这是为了database Cookbook 的 postgres 提供程序,它依赖于 postgresql Cookbook 并依赖于在编译之前安装的 pg gem。应用上述补丁可能会破坏数据库说明书。

另一种替代解决方案是创建一个在编译时运行 apt-get update 的配方,并将其放在 run_list 之前的 postgresql 中。食谱。最简单的形式可能是这样的:

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

The simplest and most direct way to solve the problem is by applying the following patch (h/t @ashchristopher):

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

The problem is that the postgresql::client recipe runs the install action on the package resources at postgresql/recipes/client.rb:39 and 44 at compile-time rather than run-time like normal (h/t Tim Potter), causing them to be evaluated by Chef (and thus installed) before anything else runs.

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)

I believe this is done in service of the database cookbook's postgres provider, which depends on the postgresql cookbook and relies on the pg gem being installed before it will compile. Applying the above patch may break the database cookbook.

The other alternative solution would be to create a recipe which runs apt-get update also at compile time and put it in your run_list before the postgresql cookbook. In its simplest form that would probably be something like:

execute "apt-get update" do
  action :nothing
end.run_action(:install)
不醒的梦 2025-01-11 17:39:32

如果不打补丁,这是解决问题的通用方法,每次运行都会更新:

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]"

Without patching, this is a generic approach to the problem that will update on every run:

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

It may be worth considering that such a run, on every run, ties up a fair bit of system resources for about 30 seconds; you may want to have a special recipe named recipe::update_apt that you have run via cron or via some other event i.e.

chef-client -o "recipe[yourrecipe::update_apt]"
木格 2025-01-11 17:39:32

要在编译时运行 apt-get update,请执行以下操作:

e = execute "apt-get update" do
  action :nothing
end

e.run_action(:run)

检查 https://wiki.opscode.com/display/chef/Evaluate+and+Run+Resources+at+Compile+Time

To run apt-get update at compile time, do:

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

沒落の蓅哖 2025-01-11 17:39:32

我也遇到了同样的情况,就我而言, apt Cookbook 在调用软件包安装的那本书之后是第二个。把它留在这里,也许有人会从中受益。检查食谱在您的运行列表、角色或其他任何地方的顺序。

I had the same situation, and in my case, apt cookbook was second after the one which called installation of package. Just leaving it here so maybe someone will benefit from it. Check the order of cookbooks in your runlist, role or wherever else.

记忆消瘦 2025-01-11 17:39:32

只是一个友好的提醒,在流浪者条款中添加所有这些食谱很快就会变得难以管理。

更好的模式是创建一个厨师角色 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]"
)

然后将此角色添加到 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

just a friendly reminder that adding all those recipes inside the vagrant provision can quickly become unmanageable.

A better pattern is to create a chef role 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]"
)

And then add this role to the Vagrantfile provisioning section:

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
软甜啾 2025-01-11 17:39:32

对于最新的 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

For the recent Chef version, i.e version 14.
You could also use https://docs.chef.io/resource_apt_update.html

apt_update

The below output was my experiment running that resource for chef_14.5.33 in local mode (zero):

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文