Chef - 在资源之前通知执行

时间:2015-12-03 13:11:36

标签: chef chef-recipe

我在execute[apt-update]食谱中有一个简单的apt资源:

execute "apt-update" do
  command "apt-get update"
  action :nothing
end

我希望只有在需要安装软件包时才能通知它。我希望有类似的东西:

include_recipe "apt"

package "openssh-server" do
  action :install
  notifies :run, 'execute[apt-update]', :before
end

:before目前不是有效时间,probably wont be any time soon

这是possible with Puppet的东西,并且想知道我是否遗漏了一些简单的东西。

2 个答案:

答案 0 :(得分:4)

保持APT缓存最新

虽然这不是您问题的答案,但我希望能为您提供实际问题的答案(这是一个非常常见的问题。):

在使用package资源之前,您应该在运行列表中包含的apt食谱将自动提取回购。

为了避免在每次厨师运行期间拉回库,默认情况下它每天只拉一次,而这个最小延迟可以通过node['apt']['periodic_update_min_delay']配置。

因此,至少对于我在去年与Chef一起使用的用例,我想我从来不需要通知apt-get update的资源。即使添加了一个额外的 apt 存储库,也可以按照以下方式轻松完成:

apt_repository 'security-ubuntu-multiverse' do
  uri        'http://security.ubuntu.com/ubuntu'
  distribution 'trusty-security'
  components ['multiverse']
  deb_src 'true'
 end

apt_repository资源的聪明之处在于它会自动触发apt-get update运行。

触发资源以运行之前

的气味

(经原作者许可,由@Tensibai提供)

为什么:before是一个错误的好主意' 99%的时间:

当您在隔离的软件包安装上考虑它时,它听起来像是要走的路,要求软件包通知执行程序以前运行apt-get update

现在,当您将此扩展到N个包(在一个或多个配方中)时,如果必须安装,则希望确保在每个包之前运行apt-get update

龙来了,我们打电话给apt-get update多少时间?在:before, :immediately之前,它会被称为N次,在每个包之前一次,这是愚蠢但可能是你的愿望。

你可能会反对它应该只进行一次,而:delayed它应该排队,但什么时候?在编译时,我们不知道是否需要安装软件包,这假设添加了一个新的“编译”软件。阶段来测试这些资源并建立预先通知'队列中。

Puppet所做的部分,以及当您希望完全控制执行顺序时出现问题的地方。

有关此here

的更多详情

:immediately_before资源

现在我说为什么应该谨慎使用,这里有好消息:
新的:immediately_before将在不久的将来按照rfc-154PR

进入厨师

答案 1 :(得分:1)

主厨12.6中添加了相关功能: https://docs.chef.io/release_notes.html#what-s-new-in-12-6

因此,您可以编写完全类似于上面粘贴的代码。