我有以下(简化)食谱称为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运行的解析阶段(即运行时)期间执行.
所以我不能完全确定,但它可能yum_install是一种资源(或某种创建资源的帮助者).食谱有效地运行两次.首先执行每个文件(字面意思是通过Ruby exec).当在DSL中创建资源时,它"编译"到内存中的资源对象,该对象被添加到全局资源集合(所有资源的大数组).编译完所有配方文件后,Chef会循环遍历资源集合并按要求运行每个资源的操作(如果需要,在中间发送通知).
总而言之,这意味着yum_install除了将对象推入数组之外,该行可能实际上没有做任何事情.您可以将其他代码包装在一个ruby_code块中以延迟它直到收敛时间.
| 归档时间: |
|
| 查看次数: |
9045 次 |
| 最近记录: |