我正在写一本定制的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
脚本将要求输入几个密码,但当我通过流浪运行这个脚本时,密钥永远不会生成,因为密码永远不会被输入。有没有办法告诉chef,如果脚本需要用户输入,只使用一些ENV变量作为值?我真的不需要它停下来向用户索要inupt。事实上,我宁愿它不要那样做。我只想指定一些值,并告诉它使用该值。
通常,您需要假设Chef在无人值守的情况下运行。您可以使用expect或pexpect(python版本)等工具来驱动绝对需要交互式输入的脚本,但请检查是否可以通过环境变量或类似的方式提供密码。
有一个名为ruby_expect的gem,可以添加到食谱中来处理这个问题。
在烹饪书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的位置。