Chef - 在资源之前通知执行

Chef - Notify an execute before resource

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

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 的东西,想知道我是否遗漏了一些简单的东西。

使 APT 缓存保持最新

虽然这不是您问题的答案,但我希望可以为您提供实际问题的答案(顺便说一句,这是一个很常见的问题。):

在使用package资源之前列表中应包含的apt食谱将自动拉取repos.

为了避免在每个 chef 运行 期间拉取 repos,默认情况下每天只拉取一次,而这个最小延迟可以通过 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% 的时间里 'good idea' 是错误的:

当你在一个独立的包安装上考虑它时,这听起来是个好方法,要求包在 运行 apt-get update 之前通知一个执行。

现在,当您将此扩展到 N 个包(在 1 个或多个食谱中)时,您将希望确保 apt-get update 已经 运行 在每个包之前 运行 如果必须安装它。

巨龙来了,叫多少次apt-get update?直接 :before, :immediately 它将被调用 N 次,在每个包裹之前调用一次,这很愚蠢,但可能是您的愿望。

你可能会反对它应该只做一次,并且作为 :delayed 它应该排队,但是什么时候?在编译时我们不知道包是否需要安装,这假设添加一个新的 'compile' 阶段来测试这些资源并构建 'pre-notification' 队列。

这是 Puppet 所做的一部分,当您希望完全控制执行顺序时,它就会出现问题。

有关此内容的更多详细信息here

:immediately_before 资源

现在我说了为什么要少用它,好消息来了:
根据 rfc-154 and this PR

,新的 :immediately_before 将在不久的将来成为厨师

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

所以你现在可以像上面粘贴的那样编写代码了。