【问题标题】:Chef recipe: can't capture output from backticks to variable in ruby_block厨师食谱:无法将反引号的输出捕获到 ruby​​_block 中的变量
【发布时间】:2016-06-27 23:49:55
【问题描述】:

我有一个包含 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。

【问题讨论】:

  • 使用双引号来让你的变量解释年轻的学徒。

标签: ruby output chef-infra backticks


【解决方案1】:

可能是输出被定向到 STDERR 而不是 STDOUT。试试这个:

myoutput = `keytool -import -alias #{al} -keystore #{ks} -storepass #{pw} -file #{ca} -trustcacerts -noprompt 2>&1`

我没有任何要导入的证书来测试它,但单独运行 `keytool` 会将输出发送到 STDERR,而 `keytool 2>&1` 工作正常。所以我猜这个应用程序通常会写入 STDERR(很奇怪)。

【讨论】:

  • 就是这个原因!这是不寻常的行为,但我在这里确认了这一点。非常感谢!
【解决方案2】:

2016 年更新

你可以的

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

Chef 文档现在指出不应使用反引号,而应使用 mixlib-shellout 库:

始终使用 mixlib-shellout 进行脱壳。切勿使用反引号、Process.spawn、popen4 或其他任何东西!

mixlib-shellout 模块提供了一个简化的脱壳接口,同时仍然收集标准输出和标准错误,并提供对环境、工作目录、uid、gid 等的完全控制。

更多详情请见this part of the doc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多