2014-11-04 3 views
0

Я пишу пользовательский Звездочка шеф кулинарной где мне нужно, чтобы запустить этот скриптИспользуя сценарий, который требует ввода данных пользователем с шеф-поваром кулинарной книги с бродягой

bash 'create asterisk keys' do 
    user 'root' 
    cwd File.dirname(source_path) 
    code <<-EOH 
    cd asterisk-#{node.version}* 
    ./contrib/scripts/ast_tls_cert -C#{node.host} -O "#{node.box_name}" -d #{node.keys_dir} 
    EOH 
    action :nothing 
end 

Этот ast_tls_cert скрипт запросит несколько входов пароля, но когда Я запускаю это через бродягу, ключи никогда не получаются, поскольку пароли никогда не вводятся. Есть ли способ сказать шеф-повару, что если скрипт требует ввода пользователем, просто используйте некоторую переменную ENV в качестве значения? Мне действительно не нужно останавливаться и спрашивать пользователя об ошибке. На самом деле, я бы предпочел, чтобы это не делалось. Я просто хочу указать некоторое значение и сказать ему, чтобы использовать это значение.

+0

Понятно, что [этот скрипт] (http://svn.asterisk.org/svn/asterisk/trunk/contrib/scripts/ast_tls_cert) - это всего лишь удобная оболочка вокруг openssl. Вы можете напрямую выполнять вызовы команд openssl (что позволит использовать параметры командной строки -passin и -passout). Или даже вы можете просто использовать ruby ​​в ruby_block с помощью модуля OpenSSL (http://ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL.html) – Charlie

ответ

0

В общем, вы должны предположить, что Шеф-повар работает без присмотра. Вы можете использовать такие инструменты, как expect или pexpect (версия python) для управления сценариями, которые абсолютно требуют интерактивного ввода, но проверьте, можете ли вы предоставить пароли через переменные среды или аналогичные.

+0

Должно быть некоторый метод шеф-повара для этого. Я знаю, что у ruby ​​есть модуль «PTY». Сценарий ast_tls_cert не может передавать пароли в качестве параметров. – jeremywoertink

+0

Я имею в виду, что вы могли бы написать простой клон ожиданий в Ruby (действительно, [Google показывает хотя бы один существующий] (https://github.com/abates/ruby_expect)), но это не то, что делает шеф-повар или заботится о нем , – coderanger

0

Есть драгоценный камень под названием ruby_expect, который можно добавить в поваренную книгу, чтобы справиться с этим.

В верхней части вашей кулинарной книги default.rb файл, который вы хотите добавить в chef_gem 'ruby_expect'. Затем я создал ruby_block, чтобы справиться с этим.

ruby_block 'create asterisk keys' do 
    block do 
    require 'ruby_expect' 
    Dir.chdir(File.join(File.dirname(tarball_path), "asterisk-#{node.version}")) 
    exp = RubyExpect::Expect.spawn(%{./contrib/scripts/ast_tls_cert -C#{node.host} -O "#{node.box_name}" -d #{node.keys_dir}}, debug: true) 
    exp.procedure do 
     each do 
     expect %r{Enter pass phrase for /etc/asterisk/keys/ca.key:} do 
      send 'somepassword' 
     end 
     end 
    end 
    end 
    action :nothing 
end 

Где tarball_path где вы загрузили звездочку деготь.