Запускайте команды sudo в блоке ресурсов Chef

Для упрощения рассмотрим следующий блок рецепта кулинарной книги (поваренной книги).

 79: bash 'Running sudo test sleep command' do
 80:   user 'root'
 81:   cwd '/tmp'
 82:   code <<-EOH
 83:   sudo sleep 1000
 84:   EOH
 85: end

Запуск этого как

"шеф-клиент -o поваренная книга-тест"

Выход:

Mixlib::ShellOut::ShellCommandFailed
------------------------------------
Expected process to exit with [0], but received '1'
---- Begin output of "bash"  "/tmp/chef-script20150813-3835-3kj758" ----
STDOUT:
STDERR: sudo: sorry, you must have a tty to run sudo
---- End output of "bash"  "/tmp/chef-script20150813-3835-3kj758" ----
Ran "bash"  "/tmp/chef-script20150813-3835-3kj758" returned 1

Я добавил «sudo sleep» просто для примера использования. В реальном случае мы запускаем скрипты внутри вышеуказанного блока ресурсов, и эти скрипты имеют команды sudo.

После некоторой отладки было обнаружено, что блоки ресурсов «bash» и «execute» не имеют tty, выделенного для запуска внутри них команд.

Пожалуйста, поделитесь своими мыслями.


person Ram    schedule 13.08.2015    source источник
comment
Проверьте файл конфигурации sudoers (обычно /etc/sudoers) и проверьте, есть ли запись requiretty в Defaults. Если это так, вы можете удалить это, и ваш приведенный выше пример может работать.   -  person Nils Landt    schedule 13.08.2015
comment
Да. Проверил это. И да, в нем упоминается запись. Но, к сожалению, удалить это сейчас не вариант.   -  person Ram    schedule 13.08.2015
comment
Ищете способ без изменения общесистемной конфигурации.   -  person Ram    schedule 13.08.2015
comment
Есть ли у ресурсов bash или execute какие-либо свойства, которые можно настроить для запуска команд на выделенном tty? Я не нашел ничего в документации шеф-повара до сих пор.   -  person Ram    schedule 13.08.2015
comment
У вас уже есть user 'root' для ресурса, поэтому он будет работать от имени пользователя root. А зачем вам sudo?   -  person Tejay Cardon    schedule 13.08.2015


Ответы (1)


Вот в чем дело:

Любая возможность, которую вы можете использовать в Chef для запуска sudo с выделенным tty, также может использоваться кем-либо еще, что означает, что директива requiretty в вашем sudoers фактически бесполезна. Так что вы можете просто удалить его и избавить себя от необходимости работать с ним.

Сказав это, вот несколько способов обойти проблему:

  1. Вы можете ssh до localhost без пароля? Вы можете просто использовать ssh -tt localhost sudo somecomand ....

  2. Вы можете использовать инструмент expect, предназначенный для управления терминально-ориентированными программами. Что-то вроде expect -c "spawn sudo somecommand; interact".

  3. Вы можете использовать screen с чем-то вроде screen sudo somecommand.

person larsks    schedule 13.08.2015