Рецепт шеф-повара: не удается перехватить выходные данные от обратных кавычек до переменной в ruby_block

У меня есть рецепт шеф-повара с ruby_block, содержащий это:

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, и я не могу понять, почему. Есть идеи? Спасибо Дэйв

Редактировать: причина в том, что вывод этого конкретного вызова keytool собирается в stderr, а не в stdout.

2 ответа

Решение

Может случиться так, что вывод будет направлен на STDERR вместо STDOUT. Попробуй это:

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

У меня нет сертификата для импорта, чтобы проверить это, но работает `keytool` один отправляет вывод в STDERR, тогда как `keytool 2>&1` работает отлично. Я предполагаю, что это приложение пишет в STDERR нормально (очень странно).

Обновление 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

Документация шеф-повара теперь указывает, что вы не должны использовать обратные галочки, кроме mixlib-shellout библиотека:

Всегда используйте mixlib-shellout для раскладывания. Никогда не используйте backticks, Process.spawn, popen4 или что-либо еще!

Модуль mixlib-shellout обеспечивает упрощенный интерфейс для обработки, сохраняя при этом как стандартные, так и стандартные ошибки и обеспечивая полный контроль над средой, рабочим каталогом, uid, gid и т. Д.

Смотрите эту часть документа для более подробной информации.

Другие вопросы по тегам