2015-12-03 45 views
2

之前执行我有在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,如果我失去了一些东西简单的想知道。

+1

你想解决的实际问题是什么?首先更新所有软件包?或者你的意思是'apt-get update'而不是'upgrade'? – StephenKing

+0

哈,对不起,意思是'apt-get update' ...我已经更新了这个问题 –

+0

我现在注意到你已经有了一个'include_recipe'apt''。所以一切都应该没有任何通知,不是吗? – StephenKing

回答

4

保持APT缓存跟上时代的

虽然这不是一个回答你的问题,我可以希望为您提供一个答案,你的实际问题(这是一个很常见的一个BTW):

apt食谱,你应该在你运行列表之前,您使用package资源会自动拉回购。

为了避免在每次厨师运行期间拉回购,其默认情况下每天只吸取一次,而此最小延迟可通过node['apt']['periodic_update_min_delay']进行配置。

因此,至少对于我在过去几年厨师的使用案例,我认为我从来不需要通知一个资源做apt-get update。增加一个额外的容易库即使,这很容易做到如下:

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个或更多配方)时,如果必须安装apt-get update,那么您将希望确保每个包都运行apt-get update

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

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

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

这个here

:immediately_before资源

现在我说为什么它应谨慎使用,这里的好消息更多细节:
:immediately_before在它的途中到厨师在近在厨师12.6加入每rfc-154未来,这PR

+1

值得补充(放弃我的答案,因为你的答案涵盖了98%):这里通知':before'的目的是什么?它显然是立竿见影的,所以如果有4个软件包安装在4个食谱中,apt-get update会被调用4次,这就是为什么':before'通常是一个虚假的好主意的一部分 – Tensibai

+0

Thx @Tensibai的评论。随意编辑并添加剩余的2%;-) – StephenKing

+0

这似乎是一个更好的方式来做到这一点...虽然我仍然处于我想从头开始创建所有食谱的阶段......我想我将撕开apt Cookbook分开,并找出它是如何做每日更新:D ...谢谢 –