如何在厨师食谱的背景下运行java程序

我是一名厨师新秀。 我想创建一个在后台运行jar的配方。

bash 'run_jar' do code <<-EOH wget https://github.com/kiwiwin/jar-repo/releases/download/kiwi/helloworld-1.0.jar -O hello.jar java -jar hello.jar & EOH end 

helloworld-1.0.jar是程序首先打印“Hello World”,然后执行while(true)循环。

我希望当我登录到厨师 – 客户端机器时。 它应该表明有一个使用“jps”命令运行的jar。 但是没有这样的jar子运行。

我可以看到下载了hello.jar,表明代码块已经被执行了。

这个食谱有什么问题?

建议您将代码配置为作为服务运行。 有几个包装器,例如:

完成此操作后,您可以配置chef来管理新服务:

 service "myapp_service" do supports :status => true, :restart => true start_command "/usr/lib/myapp/bin/myapp start" restart_command "/usr/lib/myapp/bin/myapp restart" status_command "/usr/lib/myapp/bin/myapp status" action [ :enable, :start ] end 

您应该使用remote_file资源来获取文件,而不是在bash here文档块中使用wget

调试非常有用,如果你不确定就启用它;-)(假设你正在使用chef-solo)

chef-solo -c solo.rb -j node.json -l debug

注意:我建议将文件下载到Chef::Config[:file_cache_path]/tmp

我能够使用remote_file实现你想要的。 配方如下所示:

  temp=Chef::Config[:file_cache_path] remote_file "#{Chef::Config[:file_cache_path]}/hello.jar" do source "https://github.com/kiwiwin/jar-repo/releases/download/kiwi/helloworld-1.0.jar" mode 00644 end bash 'run_jar' do code <<-EOF /opt/jdk1.6.0_37/bin/java -jar #{temp}/hello.jar > #{temp}/hello.log 2>&1 & EOF end 

示例在EC2测试盒上运行(性能糟透……):

 # chef-solo -c solo.rb -j node.json -l debug [2013-08-26T02:51:08+00:00] INFO: Forking chef instance to converge... [2013-08-26T02:51:08+00:00] DEBUG: Fork successful. Waiting for new chef pid: 18991 [2013-08-26T02:51:08+00:00] DEBUG: Forked instance now converging Starting Chef Client, version 11.6.0 [2013-08-26T02:51:13+00:00] INFO: *** Chef 11.6.0 *** [2013-08-26T02:51:37+00:00] DEBUG: Building node object for cloud.terry.im [2013-08-26T02:51:37+00:00] DEBUG: Extracting run list from JSON attributes provided on command line [2013-08-26T02:51:37+00:00] INFO: Setting the run_list to ["recipe[main]"] from JSON [2013-08-26T02:51:37+00:00] DEBUG: Applying attributes from json file [2013-08-26T02:51:37+00:00] DEBUG: Platform is ubuntu version 12.04 [2013-08-26T02:51:37+00:00] INFO: Run List is [recipe[main]] [2013-08-26T02:51:37+00:00] INFO: Run List expands to [main] [2013-08-26T02:51:37+00:00] INFO: Starting Chef Run for cloud.terry.im [2013-08-26T02:51:37+00:00] INFO: Running start handlers [2013-08-26T02:51:37+00:00] INFO: Start handlers complete. [2013-08-26T02:51:37+00:00] DEBUG: No chefignore file found at /tmp/chef/cookbooks/chefignore no files will be ignored Compiling Cookbooks... [2013-08-26T02:51:37+00:00] DEBUG: Cookbooks to compile: [:main] [2013-08-26T02:51:37+00:00] DEBUG: Loading Recipe main via include_recipe [2013-08-26T02:51:37+00:00] DEBUG: Found recipe default in cookbook main [2013-08-26T02:51:37+00:00] DEBUG: Loading from cookbook_path: /tmp/chef/cookbooks Converging 2 resources [2013-08-26T02:51:37+00:00] DEBUG: Converging node cloud.terry.im Recipe: main::default * remote_file[/var/chef/cache/hello.jar] action create[2013-08-26T02:51:37+00:00] INFO: Processing remote_file[/var/chef/cache/hello.jar] action create (main::default line 3) [2013-08-26T02:51:37+00:00] DEBUG: touching /var/chef/cache/hello.jar to create it [2013-08-26T02:51:37+00:00] INFO: remote_file[/var/chef/cache/hello.jar] created file /var/chef/cache/hello.jar - create new file /var/chef/cache/hello.jar[2013-08-26T02:51:37+00:00] DEBUG: remote_file[/var/chef/cache/hello.jar] checking for changes [2013-08-26T02:51:37+00:00] DEBUG: Cache control headers: {} [2013-08-26T02:51:37+00:00] DEBUG: Sending HTTP Request via GET to github.com:443/kiwiwin/jar-repo/releases/download/kiwi/helloworld-1.0.jar [2013-08-26T02:51:38+00:00] DEBUG: Streaming download from https://github.com/kiwiwin/jar-repo/releases/download/kiwi/helloworld-1.0.jar to tempfile /tmp/chef-rest20130826-18991-11kv5ag [2013-08-26T02:51:38+00:00] DEBUG: Following redirect 1/10 [2013-08-26T02:51:38+00:00] DEBUG: Sending HTTP Request via GET to s3.amazonaws.com:443/github-cloud/releases/12257402/d34edcec-0ba1-11e3-9ef0-268967c7e46f.jar [2013-08-26T02:51:39+00:00] DEBUG: Streaming download from https://s3.amazonaws.com/github-cloud/releases/12257402/d34edcec-0ba1-11e3-9ef0-268967c7e46f.jar?response-content-disposition=attachment%3B%20filename%3Dhelloworld-1.0.jar&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1377485552&Signature=ahoXNIhegXTdEvUE0FoimC34x%2Bg%3D to tempfile /tmp/chef-rest20130826-18991-1ojysmn [2013-08-26T02:51:39+00:00] DEBUG: reading modes from /var/chef/cache/hello.jar file [2013-08-26T02:51:39+00:00] DEBUG: applying mode = 640, uid = 0, gid = 0 to /tmp/chef-rest20130826-18991-1ojysmn [2013-08-26T02:51:39+00:00] DEBUG: moving temporary file /tmp/chef-rest20130826-18991-1ojysmn into place at /var/chef/cache/hello.jar [2013-08-26T02:51:39+00:00] INFO: remote_file[/var/chef/cache/hello.jar] updated file contents /var/chef/cache/hello.jar - update content in file /var/chef/cache/hello.jar from none to 9d1706 (new content is binary, diff output suppressed)[2013-08-26T02:51:39+00:00] DEBUG: found current_mode == nil, so we are creating a new file, updating mode [2013-08-26T02:51:39+00:00] DEBUG: found current_mode == nil, so we are creating a new file, updating mode [2013-08-26T02:51:39+00:00] DEBUG: found target_uid == nil, so no owner was specified on resource, not managing owner [2013-08-26T02:51:39+00:00] DEBUG: found target_gid == nil, so no group was specified on resource, not managing group [2013-08-26T02:51:39+00:00] DEBUG: found target_uid == nil, so no owner was specified on resource, not managing owner [2013-08-26T02:51:39+00:00] DEBUG: found target_gid == nil, so no group was specified on resource, not managing group [2013-08-26T02:51:39+00:00] DEBUG: found current_mode == nil, so we are creating a new file, updating mode [2013-08-26T02:51:39+00:00] INFO: remote_file[/var/chef/cache/hello.jar] mode changed to 644 - change mode from '' to '0644'[2013-08-26T02:51:39+00:00] DEBUG: selinux utilities can not be found. Skipping selinux permission fixup. * bash[run_jar] action run[2013-08-26T02:51:39+00:00] INFO: Processing bash[run_jar] action run (main::default line 8) [2013-08-26T02:51:39+00:00] DEBUG: Platform ubuntu version 12.04 found [2013-08-26T02:51:41+00:00] INFO: bash[run_jar] ran successfully - execute "bash" "/tmp/chef-script20130826-18991-jvx1bi" [2013-08-26T02:51:41+00:00] INFO: Chef Run complete in 3.688815399 seconds [2013-08-26T02:51:41+00:00] INFO: Running report handlers [2013-08-26T02:51:41+00:00] INFO: Report handlers complete Chef Client finished, 2 resources updated [2013-08-26T02:51:44+00:00] DEBUG: Forked child successfully reaped (pid: 18991) [2013-08-26T02:51:44+00:00] DEBUG: Exiting root@cloud:/tmp/chef# cat /var/chef/cache/hello.log Hello World 

我认为最好使用像主管这样的工具。 我正在使用poise supervisor配方,你可以在这里阅读它。

这是一个示例代码:

 include_recipe "supervisor" service "supervisor" do supports :status => true, :restart => true action [:enable, :start] end # configure supervisor supervisor_service "sample-java-app" do command "java -jar hello.jar" directory  environment  action [:enable, :start] autostart true autorestart true stdout_logfile /var/log/sample-java-app.log redirect_stderr true user root notifies :restart, 'service[supervisor]', :delayed end 

您可以使用以下命令控制您的服务:

 $> supervisorctl start/stop/restart sample-java-app