我在 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 缓存保持最新
虽然这不是您问题的答案,但我希望可以为您提供实际问题的答案(顺便说一句,这是一个很常见的问题。):
apt在使用 package
资源之前,您应该将其包含在运行列表中的 cookbook 将自动提取存储库。
为了避免在每次 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% 的时间里都是错误的“好主意”:
当您在独立的包安装上考虑它时,这听起来是可行的方法,要求包通知执行之前运行 apt-get update
。
现在,当您将其扩展到 N 个包(在 1 个或多个 Recipe 中)时,您将希望确保 apt-get update
已在每个包之前运行(如果必须安装的话)。
龙来了,我们要调用多少次 apt-get update
?使用直接的 :before, :immediately
它将被调用 N 次,在每个包之前调用一次,这很愚蠢,但可能是你的愿望。
您可能反对它应该只执行一次,并且作为 :delayed
它应该排队,但是什么时候呢?在编译时我们不知道包是否需要安装,这假设添加一个新的“编译”阶段来测试这些资源并构建“预通知”队列。
这是 Puppet 所做的一部分,当您希望完全控制执行顺序时,问题就来了。
关于此的更多详细信息 here
新的 :immediately_before
资源
现在我说了为什么要谨慎使用它,好消息是:
根据 rfc-154,一个新的 :immediately_before
将在不久的将来进入 chef。还有这个PR
关于chef-infra - Chef - 在资源之前通知执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34066962/