如何在Chef中对命令进行用户交互?

时间:2016-01-19 10:46:11

标签: ruby chef

我有一些需要用户交互的命令,所以我想要Enter使用默认值或者从chef本身输入一些输入,这样我的实例就不会在运行时失败。例如......

./build-ca        # The command I am executing
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [IN]: 
State or Province Name (full name) [KA]:

此处按下enter将完成作业(使用默认值),同时手动执行,但我如何使用Chef自动执行此操作,有时我需要按y或其他值。任何帮助将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

我认为您正在使用Easy RSA脚本生成OpenVPN证书。

一种解决方案是生成./vars文件并致电pkitoolwhich is called by the old build-ca script):

easy_rsa_path = '/usr/share/easy-rsa' # or whatever

template "#{easy_rsa_path}/vars" # [...]

bash 'build-ca' do
  cwd easy_rsa_path
  code <<-EOH
    source ./vars && \
    ./clean-all && \
    ./pkitool --batch --initca
  EOH
  creates "#{easy_rsa_path}/keys/ca.crt"
end

更好的方法是使用OpenSSL生成证书。您可以在openvpn cookbook

中查看实施示例
bash 'openvpn-initca' do
  environment('KEY_CN' => "#{node['openvpn']['key']['org']} CA")
  code <<-EOF
    openssl req -batch -days #{node["openvpn"]["key"]["ca_expire"]} \
      -nodes -new -newkey rsa:#{key_size} -sha1 -x509 \
      -keyout #{node["openvpn"]["signing_ca_key"]} \
      -out #{node["openvpn"]["signing_ca_cert"]} \
      -config #{key_dir}/openssl.cnf
  EOF
  not_if { ::File.exists?(node['openvpn']['signing_ca_cert']) }
end

答案 1 :(得分:0)

如果您没有其他选择(例如,将参数或输入文件传递给命令或脚本,如其他人已经建议的那样),您可以编写与expect的交互脚本,并使用{{从您的厨师食谱运行它1}}资源。

请参阅How to automate user interactive command in chef recipe