我使用Vagrant生成一个标准的“exact32”框并用Chef配置它,这样我就可以在Windows机器上测试我的Node.js代码了。这很好。
我也有这个bash命令,所以它会自动安装我的npm模块:
bash "install npm modules" do
code <<-EOH
su -l vagrant -c "cd /vagrant && npm install"
EOH
end
除了我没有看到控制台输出成功完成时,这也可以正常工作。但我希望看到它,以便我们可以直观地监控正在发生的事情。这不是npm特有的。
我看到这个类似的问题没有具体答案:Vagrant - how to print Chef's command output to stdout?
我尝试指定标志,但我是一个糟糕的linux / ruby n00b并且根本没有创建错误或输出,所以请使用您的解决方案示例编辑我的代码段。
答案 0 :(得分:13)
我尝试尽可能使用日志记录,但我发现在某些情况下看到输出很重要。这是我这样做的简短版本。将执行资源替换为bash资源也可以正常工作。标准错误和标准输出都进入文件。
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
答案 1 :(得分:8)
当你运行厨师时 - 假设我们使用chef-solo
,您可以使用-l debug
将更多调试信息输出到stdout。
例如:chef-solo -c solo.rb -j node.json -l debug
例如,一本简单的食谱如下:
$ 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
您将看到以下输出,如下所示:
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
我认为它包含您想要的信息。例如,shell脚本/命令的输出和退出状态。
BTW:看起来有限制(提示输入密码?),您无法使用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
答案 2 :(得分:7)
使用live_stream
资源
execute
属性
execute 'foo' do
command 'cat /etc/hosts'
live_stream true
action :run
end
脚本输出将打印到控制台
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
答案 3 :(得分:1)
我使用了以下内容:
bash "install npm modules" do
code <<-EOH
su -l vagrant -c "cd /vagrant && npm install"
EOH
flags "-x"
end
flags属性使命令像bash -x script.sh
答案 4 :(得分:0)
相关...将log_location
(-L
)设置为文件可防止主厨日志(Chef::Log.info()
或简称log
)进入标准输出。
您可以覆盖此选项以将完整日志信息打印到stdout
chef-client -L /dev/stdout