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
所以你现在可以像上面粘贴的那样编写代码了。
我在 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
所以你现在可以像上面粘贴的那样编写代码了。