我在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的东西,并且想知道我是否遗漏了一些简单的东西。
答案 0 :(得分:4)
虽然这不是您问题的答案,但我希望能为您提供实际问题的答案(这是一个非常常见的问题。):
在使用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-154和PR
答案 1 :(得分:1)
主厨12.6中添加了相关功能: https://docs.chef.io/release_notes.html#what-s-new-in-12-6
因此,您可以编写完全类似于上面粘贴的代码。