在Chef食谱中编译时间与运行时间

Chr*_*s F 9 chef-infra

我有以下(简化)食谱称为java,当然要安装Java.

文件食谱/ default.rb

include_recipe "install_java"
Run Code Online (Sandbox Code Playgroud)

文件食谱/ install_java.rb

# Install RPM from yum repo via yum_install library function
yum_install("jdk1.7.0_51")

# List the directories in /usr/java
jdk_dir = `ls -ld /usr/java/jdk1.* | sort | tail -1`
if jdk_dir.empty?
  raise "Missing JDK installation"
end
Run Code Online (Sandbox Code Playgroud)

当我通过"chef-client -o recipe [java]"运行食谱时

Synchronizing Cookbooks:
  - java
Compiling Cookbooks...
ls: /usr/java/jdk1.*: No such file or directory
Run Code Online (Sandbox Code Playgroud)

================================================== ========================= /var/chef/cache/cookbooks/java/recipes/default.rb中的配方编译错误===== ================================================== ====================

RuntimeError
------------
Missing JDK installation
Run Code Online (Sandbox Code Playgroud)

似乎没有调用yum_install()函数.但是,如果我修改install_java.rb配方就可以了

# Install RPM from yum repo via yum_install library function
yum_install("jdk1.7.0_51")
Run Code Online (Sandbox Code Playgroud)

有用.

为什么是这样?

Tej*_*don 33

好的,所以厨师跑两次通行证.

"编译时间"

我喜欢称之为收集阶段.
此时,运行配方中的实际ruby代码.这意味着任何声明 jdk_dir = ls -ld /usr/java/jdk1.* | sort | tail -1 都会在那时执行.但是,创建Chef资源的ruby代码yum_install("jdk1.7.0_51")仅创建资源.然后,由配方代码创建的那些资源将添加到Chef resource_collection中,但资源操作尚未运行.

"收敛时间"

我称之为解决阶段.此时 - 在所有配方运行(创建资源,但没有运行操作)之后 - 我们现在准备好实际运行资源操作.Chef从resource_collection中的第一个资源开始,并在该 资源上运行指定的操作.它通过集合工作,根据需要调用通知,直到所有资源的操作都已运行.然后你的跑步完成了.

你的具体情况

因此,在您的情况下,您尝试访问收集阶段中的目录,但在解决阶段之前不会创建目录.如果要在解析阶段运行ruby代码,可以在ruby_block资源中执行此操作.例如:

ruby_block 'verify java is there' do
  block do
    if jdk_dir.empty?
      raise "Missing JDK installation, reinstall"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

如果此ruby_block资源放在您的yum_install(可能应该是yum_package)资源之后,那么它将放在collection_phase中的安装资源之后,然后在Chef运行的解析阶段(即运行时)期间执行.


cod*_*ger 7

所以我不能完全确定,但它可能yum_install是一种资源(或某种创建资源的帮助者).食谱有效地运行两次.首先执行每个文件(字面意思是通过Ruby exec).当在DSL中创建资源时,它"编译"到内存中的资源对象,该对象被添加到全局资源集合(所有资源的大数组).编译完所有配方文件后,Chef会循环遍历资源集合并按要求运行每个资源的操作(如果需要,在中间发送通知).

总而言之,这意味着yum_install除了将对象推入数组之外,该行可能实际上没有做任何事情.您可以将其他代码包装在一个ruby_code块中以延迟它直到收敛时间.