我正在尝试创建一个Chef食谱,目前,它主要只是另一本食谱(audit cookbook)的包装食谱。我仍在学习Chef,但从About Recipes documentation和Resources Reference documentation的经验来看,Chef食谱应按照定义的顺序执行(通过Ruby代码和/或Chef资源)
在“关于食谱”文档中,它提到了
包括食谱时,在该食谱中找到的资源将是 (以完全相同的顺序)插入到 include_recipe关键字已找到。
在资源参考文档中,他们拥有一个 apt_update 资源,由于该资源是在食谱中较早定义的,因此可能在 include_recipe 方法之前执行。
我的包装食谱只有一个食谱default.rb,实际上是这两行:
package 'ruby-dev'
include_recipe 'audit'
但是,在执行厨师客户或厨师独奏期间,我发现 audit :: inspec 配方在 security :: default 配方之前运行之所以中断,是因为InSpec还有一些其他依赖项需要预先安装。在使用 package 资源之前,我曾使用 execute 资源根据使用case语句的平台显式运行apt-get install ruby-dev
或yum install ruby-dev
,但是相同的问题(所有代码均被跳过,并且首先调用 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
软件包,而不是ruby-dev
软件包,并且还安装了两个gem供Chef客户端使用。所有这些都按照我在Chef运行的编译阶段期望的顺序安装。
来源:
答案 0 :(得分:1)
如果您检查container
配方,则会发现它使用了编译时间installation of the inspec rubygem(请参见最后一行)
jobs:
my_job:
container:
image: node:10.16-jessie
env:
NODE_ENV: development
ports:
- 80
volumes:
- my_docker_volume:/volume_mount
options: --cpus 1
运行动作
在资源块末尾使用
val it = plus (peanify 2) (peanify 1)
在编译阶段运行指定的操作。