Chef infra Ruby_块中的变量

Chef infra Ruby_块中的变量,chef-infra,chef-recipe,Chef Infra,Chef Recipe,我对厨师食谱的聚合/编译阶段有些纠结 我想更新/创建java密钥库,但前提是vault中提供的证书与密钥库中的证书不同 因此,我从系统上的vault写入临时文件,使用ruby_块计算md5,并在管理密钥库的execute块上的唯一_if条件上使用此md5 以下是我最后尝试的代码: ruby_block "get private cert md5" do block do vault_md5 = Mixlib::ShellOut.new("openssl x509 -in /tmp/myc

我对厨师食谱的聚合/编译阶段有些纠结

我想更新/创建java密钥库,但前提是vault中提供的证书与密钥库中的证书不同

因此,我从系统上的vault写入临时文件,使用ruby_块计算md5,并在管理密钥库的execute块上的唯一_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
使用此代码时,执行块if始终被跳过,因为只有_if。
感谢您的帮助

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

我将重点放在运行上,而不是动态地尝试更改惟一的_语句

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_块驱动,它可以处理编译阶段生成的数据。在这里,我生成的本地文件

Mixlib::ShellOut不需要包装在ruby_块中,cur_md5 run_命令在哪里?嗨,我认为在我的例子中,需要包装Mixlib::ShellOut,否则它将在编译阶段执行,而此时/tmp.mycerrt.crt文件不存在。cur_md5在之前运行,没有包装在ruby块中,因为它测试始终存在的密钥库。