我有以下(简化的)方法,称为 java,当然可以安装 Java。
文件菜谱/default.rb
include_recipe "install_java"
文件菜谱/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
当我通过“chef-client -o Recipe[java]”运行菜谱时
Synchronizing Cookbooks:
- java
Compiling Cookbooks...
ls: /usr/java/jdk1.*: No such file or directory
=================================================== =========================
/var/chef/cache/cookbooks/java/recipes/default.rb 中的食谱编译错误 ================================ ===============================================
RuntimeError
------------
Missing JDK installation
看起来 yum_install() 函数没有被调用。但是,如果我修改 install_java.rb 配方以仅具有
# Install RPM from yum repo via yum_install library function
yum_install("jdk1.7.0_51")
有用。
为什么是这样?
好吧,厨师跑了两遍。
“编译时间”
我喜欢称其为收集阶段.
此时,您的配方中的实际 ruby 代码已运行。这意味着任何类似的陈述jdk_dir = ls -ld /usr/java/jdk1.* | sort | tail -1
届时将被处决。但是,创建 Chef 资源的 ruby 代码yum_install("jdk1.7.0_51")
只创造资源。这些由您的食谱代码创建的资源随后将添加到 Chef 中资源集合,但资源操作尚未运行。
《汇聚时间》
我称之为解决阶段。
此时 - 在所有配方运行之后(创建资源,但不运行操作) - 我们现在准备好实际运行资源操作。 Chef 从第一个资源开始资源集合并对该资源运行指定的操作。它通过集合工作,根据需要调用通知,直到所有资源的操作都已运行。然后你的跑步就完成了。
您的具体案例
因此,就您而言,您正在尝试访问收集阶段但您不会创建目录,直到解决阶段。如果你想在这段时间内运行 ruby 代码解决阶段你可以这样做ruby_block
资源。例如:
ruby_block 'verify java is there' do
block do
if jdk_dir.empty?
raise "Missing JDK installation, reinstall"
end
end
end
If this ruby_block
资源放置在您之后yum_install
(这可能应该是yum_package
) 资源,那么它将被放置在安装资源之后收集阶段,然后在期间执行解决阶段 (i.e., run time)的厨师运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)