【发布时间】:2020-02-07 09:40:55
【问题描述】:
我正在尝试创建一个厨师食谱,目前,它主要是另一个食谱(audit cookbook)的包装食谱。我仍在学习 Chef,但根据我从 About Recipes documentation 和 Resources Reference documentation 收集到的信息,Chef 食谱应该按照定义的顺序执行(通过 Ruby 代码和/或 Chef 资源)。
在 About Recipes 文档中,它提到了
当包含一个配方时,在该配方中找到的资源将是 插入(以相同的确切顺序)在点 include_recipe 关键字的位置。
在资源参考文档中,他们有一个 apt_update 资源,该资源可能在 include_recipe 方法之前执行,因为它在配方的前面已定义。
我的包装食谱只有一个配方,default.rb,实际上就是这两行:
package 'ruby-dev'
include_recipe 'audit'
但是,在 chef-client 或 chef-solo 运行期间,我看到 audit::inspec 配方在 security::default 配方之前运行,这会导致事情发生break 因为 InSpec 有一些其他的依赖项需要预先安装。在我使用 package 资源之前,我使用 execute 资源来显式运行 apt-get install ruby-dev 或 yum install ruby-dev,具体取决于使用 case 语句的平台,但同样的问题(所有该代码被跳过并首先调用 include_recipe 方法)。
如果它有用,我使用的是 Chef 12,我知道它是 EOL,但我还有其他依赖项需要我现在坚持使用这个版本的 Chef。
我很可能只是误解了 Chef 如何融合工作以及执行发生的顺序,但这让我很伤心,所以我真的很感激一些指点! include_recipe 是否总是出现在您的配方中的其他代码之前?有没有办法解决?我错过了什么吗?
-- 编辑--
我能够使用我的食谱中的以下代码获得所需的功能(在 include_recipe 调用触发安装依赖项 gem 之前安装其他包和 gem):
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 包,而不是我原始代码 sn-p 中的 ruby-dev 包,并且还安装了两个 gem 供 Chef 客户端使用。在 Chef 运行的编译阶段,这一切都按照我预期的顺序安装。
来源:
【问题讨论】:
标签: ruby chef-infra chef-recipe