厨师食谱“ include_recipe”优先于其他代码和资源

时间:2019-10-10 02:13:15

标签: ruby chef chef-recipe

我正在尝试创建一个Chef食谱,目前,它主要只是另一本食谱(audit cookbook)的包装食谱。我仍在学习Chef,但从About Recipes documentationResources 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-devyum 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运行的编译阶段期望的顺序安装。

来源:

1 个答案:

答案 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

来自chef documentation

  

运行动作

     

在资源块末尾使用val it = plus (peanify 2) (peanify 1) 在编译阶段运行指定的操作。