使用一个脚本,需要用户输入chef cookbook with vagrant
我正在写一本自定义的星号厨师烹饪书,在这里我需要运行这个脚本使用一个脚本,需要用户输入chef cookbook with vagrant,vagrant,chef-infra,asterisk,cookbook,Vagrant,Chef Infra,Asterisk,Cookbook,我正在写一本自定义的星号厨师烹饪书,在这里我需要运行这个脚本 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_d
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运行这个脚本时,密钥永远不会生成,因为密码永远不会被输入。有没有办法告诉chef,如果脚本需要用户输入,只需使用某个ENV变量作为值?我真的不需要它停下来向用户索要inut。事实上,我宁愿它不要那样做。我只想指定一些值,并告诉它使用该值。通常,您需要假设Chef在无人值守的情况下运行。您可以使用expect或pexpectpython版本等工具来驱动绝对需要交互输入的脚本,但请检查是否可以通过环境变量或类似工具提供密码。有一个名为gem的工具,可以添加到烹饪书中来处理此问题 在cookbook default.rb文件的顶部,您需要添加chef_gem“ruby_expect”。接下来,我创建了一个ruby_块来处理这个问题
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\u path是您下载星号tar的地方。必须有一些chef方法才能做到这一点。我知道ruby有PTY模块。ast_tls_cert脚本没有将密码作为选项传递的方法。我的意思是,您确实可以用Ruby编写expect的简单克隆,但这不是Chef所做或关心的事情。无可否认,它只是openssl的一个方便的包装器。您可以直接调用openssl命令,这将启用-passin和-passout命令行选项。或者,您甚至可以在ruby_块中使用ruby