![](/img/trans.png)
[英]Chef: Can a variable set within one ruby_block be used later in a recipe?
[英]Chef recipe: can't capture output from backticks to variable in ruby_block
我有一个带有ruby_block的Chef配方包含:
myoutput = `keytool -import -alias #{al} -keystore #{ks} -storepass #{pw} -file #{ca} -trustcacerts -noprompt`
puts ":" + myoutput + ":"
Chef::Log.error('Error installing CA Cert') unless myoutput.include? "Certificate was added to keystore"
(所有变量都已正确设置。)以下是相关输出:
Certificate was added to keystore
::
[2013-07-03T21:26:41-07:00] ERROR: Error installing CA Cert
请注意::。 为什么myoutput设置不正确? 当我手动运行该命令时,我得到了预期的输出。 反引号中的命令执行它应该的操作,所以我知道它正在运行,但由于某种原因,命令的标准输出没有被分配给myoutput,我无法弄清楚原因。 有任何想法吗? 谢谢 - 戴夫
编辑:原因是因为这个特定的'keytool'调用的输出是stderr,而不是stdout。
可能是输出被定向到STDERR而不是STDOUT。 尝试这个:
myoutput = `keytool -import -alias #{al} -keystore #{ks} -storepass #{pw} -file #{ca} -trustcacerts -noprompt 2>&1`
我没有任何证书可以导入来测试它,但单独运行`keytool`
会将输出发送到STDERR,而`keytool 2>&1`
可以正常工作。 所以我猜这个应用程序正常写入STDERR(很奇怪)。
你可以做到
require 'mixlib/shellout'
cmd = Mixlib::ShellOut.new("keytool -import -alias #{al} -keystore #{ks} -storepass #{pw} -file #{ca} -trustcacerts -noprompt")
cmd.run_command
# you can now use cmd.stdout and cmd.stderr
厨师文档现在表明你不应该使用反引号,而是使用mixlib-shellout
库:
始终使用mixlib-shellout来shell。 永远不要使用反引号,Process.spawn,popen4或其他任何东西!
mixlib-shellout模块提供了一个简化的界面来进行shelling,同时仍然收集标准输出和标准错误,并提供对环境,工作目录,uid,gid等的完全控制。
有关更多详细信息,请参阅文档的这一部分 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.