Chef第一次执行失败

时间:2015-06-26 19:01:49

标签: ruby spring-boot chef test-kitchen

我和Chef Recipe有一个奇怪的问题。让我告诉你,如果事情看起来非常错误,我是厨师的新手,请原谅我。

我有我的war文件,它是由Spring Boot构建的。我只需要运行java -jar <file>.war -config=config/来运行我的应用程序。

我最近开始尝试使用Chef,并开始编写完成这项工作的食谱。

我的食谱代码如下:

#Some code has been omitted intentionally.

directory "#{home}" do
  owner 'root'
  group 'root'
  mode '0755'
  recursive true
end

directory "#{home}/config" do
  owner 'root'
  group 'root'
  mode '0755'
end
cookbook_file "#{home}/config/ehcache.xml" do
  source "ehcache.xml"
  mode "0644"
end
# Get the war file from the repo
remote_file "#{home}/app.war" do
   source "#{node['baseos']['files_repo_url']}/wars/app.war"
   owner 'root'
   group 'root'
   mode '0644'
end

execute 'Run the war file' do
  command "java -jar '#{home}/app.war' -config='#{home}/config/'"
  action :run
end

execute命令被触发之前,war文件以及相关的配置文件夹及其内容已成功复制到各自的目标。问题是当机器使用kitchen create新创建时,第一个kitchen verify会失败,说'Errno::ENOENT: No such file or directory - java -jar /opt/com/app.war -config=config/'。 这只是第一次发生。令人惊讶的是,在再次说出kitchen verify后,应用程序启动并成功运行。

这很奇怪,因为所需的文件app.war和config /已经[或应该]在机器中已经具有适当的权限。

我知道Chef按顺序处理这些事情,所以假设执行命令是我的食谱中的最后一行,它应该已经具有运行war文件所需的内容。我疯了,任何人都可以对这个提供一些见解吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

虽然这有点违反直觉,但这可能是因为您java上没有$PATH。这可能意味着没有安装java,或者安装它但不是Chef可以找到它的方式。请记住,环境变量仅在进程启动时继承,因此如果您以安装程序设置某些全局更改为$PATH的方式安装Java,那么Chef将无法看到它。一个很好的解决方法是使用JVM二进制文件的完整路径(/opt/whatever/bin/java或其他东西)。