2013-12-16 84 views
1

我想创建一个厨师配方取决于tomcat菜谱如厨师配方编译失败

tomcat_user = node[:tomcat][:user] 
tomcat_user_home_folder = node[:etc][:passwd][tomcat_user][:dir] 
execute "Install jasper license" do 
    command "cp jasperserver.license #{tomcat_user_home_folder}/" 
    cwd "#{node["install-jasper-license"]["license-location"]}" 
end 

当我的节点上运行sudo chef-client,我得到以下错误:

================================================================================ 
Recipe Compile Error in /var/chef/cache/cookbooks/install-jasper-license/recipes/default.rb 
================================================================================ 

NoMethodError 
------------- 
undefined method `[]' for nil:NilClass 

在我看来,这个食谱找不到node[:etc][:passwd][tomcat_user]。当tomcat配方运行时,将会安装一个tomcat用户。我还在本食谱的metadata.rb中添加了depends 'tomcat'。我的意图是在运行tomcat的用户的家中安装一个文件。我该如何解决它?

回答

2

问题的根源在于,在您读取OHAI设置的值之后创建tomcat用户。

为了解决这个问题,必须执行两个步骤:

  1. 你必须让你有访问数据重新加载OHAI数据的用户创建之后。通常,OHAI数据(在node["etc"]中)仅在Chef运行的第一阶段中的一个阶段更新一次。
  2. 你必须去适应你的食谱,以便它被更新后

您可以重构类似于此代码的帐户数据是只读:

######################################################################## 
# 1. Reload OHAI data if required 
ohai "reload_passwd" do 
    action :nothing 
    plugin "passwd" 
end 

# Make the installation of the tomcat package notify the reload of the OHAI data 
# This works for all the Linux's but not SmartOS 
tomcat_package = resources(:package => "tomcat#{node["tomcat"]["base_version"]}") 
tomcat_package.notifies :reload, "ohai[reload_passwd]", :immediately 

######################################################################## 
# 2. Install license file 

ruby_block "Install jasper license" do 
    block do 
    tomcat_user = node["tomcat"]["user"] 
    tomcat_user_home_folder = node["etc"]["passwd"][tomcat_user]["dir"] 

    File.copy File.join(node["install-jasper-license"]["license-location"], "jasperserver.license"), File.join(tomcat_user_home_folder, "jasperserver.license") 
    end 
    not_if{ File.exist? File.join(tomcat_user_home_folder, "jasperserver.license") } 
end 

ruby_block确保您阅读数据仅在OHAI数据更新后的转换阶段进行。

+0

可以用懒惰属性评估来解决吗? http://docs.opscode.com/resource_common.html#lazy-attribute-evaluation –

+0

你也可以在'execute'或'ruby_block'中使用惰性评估。您仍然需要重新加载ohai,以便您可以访问用户信息。 –