chef-infra - Chef - 在资源之前通知执行

标签 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]', :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/

相关文章:

linux - 无法与 Chef 一起设置 GOPATH

ruby-on-rails - 在运行包更新时避免 RSA key 指纹

mysql - Chef Recipe 将值添加到 mysql 表

chef-recipe - 如果条件存在,文件删除操作

ubuntu - 在资源 `install` 上执行操作 'package[libmysqlclient-dev]' 时出错

chef-infra - Vagrant - 如何将 Chef 的命令输出打印到标准输出?

python - 使用 Python RSA 将请求复制到 Chef

chef-infra - 点文件应该放在 Chef Recipe 集中的什么位置?

chef-infra - 使用 Chef 管理网站用户、虚拟主机和 PHP-FPM 池

chef-infra - Chef : How to rollback a run of cookbook?