我正在尝试创建一个取决于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的用户的home位置安装一个文件。我该怎么做呢?
答案 0 :(得分:2)
您的问题的根源是您在读取由OHAI设置的值后创建的tomcat用户。
要解决此问题,您必须执行以下两个步骤:
node["etc"]
)仅在Chef运行的第一阶段中更新一次。你可以像这样重构你的代码:
########################################################################
# 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数据更新后的转换阶段读取数据。