使用需要用户输入的脚本与厨师食谱与流浪汉

时间:2014-11-04 00:42:08

标签: vagrant chef asterisk cookbook

我正在编写一个自定义的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变量作为值?我真的不需要它停下来并要求用户输入。实际上,我认为它没有做到这一点。我只想指定一些值并告诉它使用该值。

2 个答案:

答案 0 :(得分:0)

通常,您需要假设Chef无人值守。您可以使用expect或pexpect(python版本)等工具来驱动绝对需要交互式输入的脚本,但请检查您是否可以通过环境变量或类似提供密码。

答案 1 :(得分: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是您下载星号tar的地方。