I use Vagrant to spawn a standard "precise32" box and provision it with Chef so I can test my Node.js code on Linux when I work on a Windows machine. This works fine.
I also have this bash command so it auto installs my npm modules:
bash "install npm modules" do code <<-EOH su -l vagrant -c "cd /vagrant && npm install" EOH end This also works fine except that I never see the console output if it completes successfully. But I'd like to see it so we can visually monitor what is going on. This is not specific to npm.
I see this similar question with no concrete answers: Vagrant - how to print Chef's command output to stdout?
I tried specifying flags but I'm a terrible linux/ruby n00b and create either errors or no output at all, so please edit my snippet with an example of your solution.
5 Answers
I try to use logging when possible, but I've found that in some scenarios seeing the output is important. Here's the short version of the way I do it. Substituting the execute resource for the bash resource also works fine. Both standard error and standard output go into the file.
results = "/tmp/output.txt" file results do action :delete end cmd = "ls /" bash cmd do code <<-EOH #{cmd} &> #{results} EOH end ruby_block "Results" do only_if { ::File.exists?(results) } block do print "\n" File.open(results).each do |line| print line end end end 3Use the live_stream attribute of the execute resource
execute 'foo' do command 'cat /etc/hosts' live_stream true action :run end Script output will be printed to the console
Starting Chef Client, version 12.18.31 resolving cookbooks for run list: ["apt::default", "foobar::default"] Synchronizing Cookbooks: Converging 2 resources Recipe: foobar::default * execute[foo] action run [execute] 127.0.0.1 default-ubuntu-1604 default-ubuntu-1604 127.0.0.1 localhost 127.0.1.1 vagrant.vm vagrant ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters - execute cat /etc/hosts 2When you run chef - suppose we are using chef-solo, you can use -l debug to output more debug information into stdout.
For example: chef-solo -c solo.rb -j node.json -l debug
For example, a simple cookbook as below:
$ tree . ├── cookbooks │ └── main │ └── recipes │ └── default.rb ├── node.json └── solo.rb 3 directories, 3 files default.rb
bash "echo something" do code <<-EOF echo 'I am a chef!' EOF end You'll see the following output like below:
Compiling Cookbooks... [2013-07-24T15:49:26+10:00] DEBUG: Cookbooks to compile: [:main] [2013-07-24T15:49:26+10:00] DEBUG: Loading Recipe main via include_recipe [2013-07-24T15:49:26+10:00] DEBUG: Found recipe default in cookbook main [2013-07-24T15:49:26+10:00] DEBUG: Loading from cookbook_path: /data/DevOps/chef/cookbooks Converging 1 resources [2013-07-24T15:49:26+10:00] DEBUG: Converging node optiplex790 Recipe: main::default * bash[echo something] action run[2013-07-24T15:49:26+10:00] INFO: Processing bash[echo something] action run (main::default line 4) [2013-07-24T15:49:26+10:00] DEBUG: Platform ubuntu version 13.04 found I am a chef! [2013-07-24T15:49:26+10:00] INFO: bash[echo something] ran successfully - execute "bash" "/tmp/chef-script20130724-17175-tgkhkz" [2013-07-24T15:49:26+10:00] INFO: Chef Run complete in 0.041678909 seconds [2013-07-24T15:49:26+10:00] INFO: Running report handlers [2013-07-24T15:49:26+10:00] INFO: Report handlers complete Chef Client finished, 1 resources updated [2013-07-24T15:49:26+10:00] DEBUG: Forked child successfully reaped (pid: 17175) [2013-07-24T15:49:26+10:00] DEBUG: Exiting I think it contains the information you want. For example, output and the exit status of the shell script/command.
BTW: looks like there is a limitation (prompt for password?), you won't be able to use su
[2013-07-24T15:46:10+10:00] INFO: Running queued delayed notifications before re-raising exception [2013-07-24T15:46:10+10:00] DEBUG: Re-raising exception: Mixlib::ShellOut::ShellCommandFailed - bash[echo something] (main::default line 4) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1' ---- Begin output of "bash" "/tmp/chef-script20130724-16938-1jhil9v" ---- STDOUT: STDERR: su: must be run from a terminal ---- End output of "bash" "/tmp/chef-script20130724-16938-1jhil9v" ---- Ran "bash" "/tmp/chef-script20130724-16938-1jhil9v" returned 1 3I used the following:
bash "install npm modules" do code <<-EOH su -l vagrant -c "cd /vagrant && npm install" EOH flags "-x" end The flags property makes the command execute like bash -x script.sh
Kind of related... setting the log_location (-L) to a file prevents the chef logs (Chef::Log.info() or simply log) from going to standard out.
You can override this to print the full log information to stdout
chef-client -L /dev/stdout