Использование скрипта, требующего ввода данных пользователем, с кулинарной книгой шеф-повара с vagrant

Я пишу специальную кулинарную книгу шеф-повара Asterisk, где мне нужно запустить этот скрипт.

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 потребует ввода нескольких паролей, но когда я запускаю его через vagrant, ключи никогда не генерируются, поскольку пароли никогда не вводятся. Есть ли способ сообщить шеф-повару, что, если скрипт требует ввода данных пользователем, просто используйте некоторую переменную ENV в качестве значения? Мне действительно не нужно, чтобы он останавливался и запрашивал у пользователя ввод. На самом деле, я бы предпочел, чтобы он этого не делал. Я просто хочу указать какое-то значение и сказать ему использовать это значение.


person jeremywoertink    schedule 04.11.2014    source источник
comment
Общеизвестно, что этот скрипт является просто удобной оболочкой для openssl. Возможно, вы сможете напрямую вызывать команды openssl (что активирует параметры командной строки -passin и -passout). Или даже вы можете просто использовать ruby ​​в ruby_block с Модуль OpenSSL   -  person Charlie    schedule 04.11.2014


Ответы (2)


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

person coderanger    schedule 04.11.2014
comment
Для этого должен быть какой-то метод шеф-повара. Я знаю, что у ruby ​​есть модуль PTY. Сценарий ast_tls_cert не имеет возможности передавать пароли в качестве параметров. - person jeremywoertink; 04.11.2014
comment
Я имею в виду, что вы можете написать простой клон expect на Ruby (действительно, Google показывает, что по крайней мере один существует) , но это не то, что Шеф делает или заботится о нем. - person coderanger; 04.11.2014

Существует гем под названием 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 - это место, где вы загрузили тар астериск.

person jeremywoertink    schedule 04.11.2014