Chef 食谱 'include_recipe' 优先于其他代码和资源

Chef recipe 'include_recipe' takes precedence over other code and resources

我正在尝试创建一本 Chef 食谱,目前它主要只是另一本食谱的包装食谱(audit cookbook). I'm still learning Chef, but from what I can gather from the About Recipes documentation and the Resources Reference documentation,Chef 食谱应按照定义的顺序执行(通过Ruby 代码 and/or Chef 资源)。

在 About Recipes 文档中提到

When a recipe is included, the resources found in that recipe will be inserted (in the same exact order) at the point where the include_recipe keyword is located.

在资源参考文档中,他们有一个 apt_update 资源,大概在 include_recipe 之前执行方法,因为它是在食谱的前面定义的。

我的包装食谱只有一个食谱,default.rb,就是这两行:

package 'ruby-dev'
include_recipe 'audit'

但是,在厨师客户或厨师独奏期间 运行 我看到 audit::inspec 食谱 运行 之前 security::default 导致事情中断的配方,因为 InSpec 有一些其他依赖项需要预先安装。在我使用 package 资源之前,我使用 execute 资源显式 运行 apt-get install ruby-devyum install ruby-dev取决于使用 case 语句的平台,但同样的问题(所有代码都被跳过, include_recipe 方法首先被调用)。

如果它有用,我使用的是 Chef 12,我知道它已停产,但我还有其他依赖项需要我暂时坚持使用此版本的 Chef。

我很可能只是误解了 Chef 如何收敛工作以及执行的顺序,但这让我很伤心,所以我真的很感激一些指示! include_recipe 是否总是出现在您的配方中的其他代码之前?有没有办法解决?我错过了什么吗?

-- 编辑 --

我能够使用我的食谱中的以下代码获得所需的功能(在 include_recipe 调用触发安装依赖项 gem 之前安装其他包和 gems)食谱:

package 'build-essential' do
  action :nothing
end.run_action(:install)

chef_gem 'train' do
  version "1.4.4"
  action :install
end

chef_gem 'signet' do
  version "0.11.0"
  action :install
end

include_recipe 'audit'

请注意,我最终安装了 build-essential 包而不是原始代码片段中的 ruby-dev 包,并且还安装了两个 gem 供 Chef 客户端使用。这一切都按照我在 Chef 运行.

编译阶段预期的顺序安装

来源:

如果你检查 audit::inspec 配方,你会发现它使用编译时间 installation of the inspec rubygem(见最后一行)

inspec_gem 'inspec' do
  version node['audit']['inspec_version']
  source node['audit']['inspec_gem_source']
  action :nothing
end.run_action(:install)

来自chef documentation

run_action

Use .run_action(:some_action) at the end of a resource block to run the specified action during the compile phase.