Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Chef infra 厨师长-在执行资源之前通知执行_Chef Infra_Chef Recipe - Fatal编程技术网

Chef infra 厨师长-在执行资源之前通知执行

Chef infra 厨师长-在执行资源之前通知执行,chef-infra,chef-recipe,Chef Infra,Chef Recipe,我在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]',

我在
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
当前不是有效的计时,并且

就是这样,我想知道我是否遗漏了一些简单的东西。

保持APT缓存最新 虽然这不是你问题的答案,但我希望能为你的实际问题提供一个答案(顺便说一句,这是一个非常常见的问题):

在使用
软件包之前,您应该包含在跑步列表中的食谱将自动提取回购。

为了避免在每次chef运行期间拉取回购,默认情况下,它每天只拉取一次回购,而这个最小延迟可以通过
节点['apt']['periodic\u update\u min\u delay']
进行配置

因此,至少对于我在过去几年中与Chef一起使用的用例,我认为我不需要通知资源执行
apt get update
。即使在添加额外的apt存储库时,也可以通过以下方式轻松完成:

apt_存储库“安全ubuntu多元宇宙”怎么办
uri'http://security.ubuntu.com/ubuntu'
分发“可靠的安全性”
成分[‘多元宇宙’]
deb_src“正确”
结束
apt_repository
资源的聪明之处在于它会自动触发
apt get update
运行

触发资源之前运行的气味 (经原作者许可添加,作者)

关于为什么
:在
之前99%的时间是错误的“好主意”:

当您在一个独立的软件包安装中考虑这个问题时,听起来应该这样做,要求软件包在安装之前通知execute运行
apt get update

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

龙来了,我们要打多少次电话才能得到更新?用一个直接的
:before,:immediate
它将被调用N次,在每个包之前调用一次,这很愚蠢,但可能是您的愿望

您可能会反对,它应该只执行一次,并且作为
:delayed
,它应该排队,但是什么时候?在编译时,我们不知道是否需要安装包,因此假设添加一个新的“编译”阶段来测试这些资源并构建“预通知”队列

这是木偶所做的一部分,当你想要完全控制执行顺序的时候,问题就来了

更多细节

新的
:紧跟在
资源之前
现在我说了为什么应该节约使用,好消息是:

一个新的
:在不久的将来即将进入chef,这项功能已添加到chef 12.6中:


因此,您可以完全按照上面粘贴的方式编写代码。

您想要解决的实际问题是什么?首先更新所有包?或者你的意思是
apt get update
而不是
upgrade
?哈,是的,对不起,意思是
apt get update
。。。我已经更新了这个问题,现在我注意到您已经有了一个
include\u recipe“apt”
。因此,一切都应该在没有任何通知的情况下工作,不是吗?它有
操作:无
,因此它不会运行,除非通知。没有,我在第二个块中包含
apt::default
配方。但不确定,如果这是社区
apt
食谱-可能不值得补充(放弃我的答案,因为你的答案涵盖了98%):在这里发出
通知之前,
的目的是什么?这显然是即时的,因此如果在4个配方中安装4个软件包,那么apt get update将被调用4次,这就是为什么
:before
对于注释来说通常是一个假好的ideaThx@Tensibai。请随意编辑和添加剩余的2%;-)这似乎是一个更好的方法。。。虽然我还处在一个阶段,我想从头开始创作我所有的食谱。。。我想我会撕开apt的食谱,看看它是如何做每日更新的:D。。。Thanks@StephenKing抱歉,变成了长添加,同时发现更新信息:)Tensibai,写得好,谢谢!拉伸,尽量避免重新发明轮子;-)太棒了,谢谢