Ruby_Block的变量

时间:2015-10-16 20:04:49

标签: chef chef-recipe

我对厨师食谱的融合/编译阶段有些困难。

我想更新/创建一个java密钥库,only_if保险库中提供的证书与密钥库中的证书不同。

所以我从系统上的保险库写入临时文件,使用ruby_block计算md5,并在管理密钥库的执行块上的only_if条件下使用此md5。

这是我尝试的最后一个代码:

ruby_block "get private cert md5" do
 block do
   vault_md5 = Mixlib::ShellOut.new("openssl x509 -in /tmp/mycerrt.crt -fingerprint -md5 | head -1 | sed -e 's/MD5 Fingerprint=//'")
   vault_md5.run_command
   # get dynamically the only_if statement to update it.
   exec_r = run_context.resource_collection.find(:execute => "create p12 store")
   exec_r.only_if "[ \"#{cur_md5.stdout}\" -ne \"#{vault_md5.stdout}\" ]"
 end
end

execute "create p12 store" do
        command "openssl pkcs12 -export -in /tmp/mycerrt.crt -inkey /tmp/myKey -certfile /tmp/mycerrt.crt  -name priv -out /tmp/keystore.p12 -password pass:#{key['PrivateKeystorePassword']}"
        only_if "[ \"#{cur_md5.stdout}\" -eq '']"
        notifies :run, 'execute[convert keystore]', :immediately
        action :run
end

使用此代码,如果由于only_if总是跳过执行块。 谢谢你的帮助

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法,因此我真的不知道这是解决这类问题的最佳方式。

我没有动态尝试更改only_statement,而是专注于运行。

ruby_block "get private cert md5" do
 block do
   vault_md5 = Mixlib::ShellOut.new("openssl x509 -in /tmp/cert.crt -fingerprint -md5 | head -1 | sed -e 's/MD5 Fingerprint=//'")
   vault_md5.run_command
   exec_r = run_context.resource_collection.find(:execute => "create p12 store")
   if ( cur_md5.stdout != vault_md5.stdout )
      exec_r.action "run"
   end
 end

结果执行块是这个ruby_block的驱动程序,它可以处理编译阶段生成的数据(这里生成我的本地文件)