Рецепт шеф-повара: не удается перехватить выходные данные от обратных кавычек до переменной в 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 и т. Д.
Смотрите эту часть документа для более подробной информации.