使用一个脚本,需要用户输入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