2015-10-16 58 views
0

我對廚師食譜的收斂/編譯階段有些困惑。來自Ruby_Block的變量

我想更新/創建一個java密鑰庫,only_if提供在保險庫中的證書不同於密鑰庫中的證書。

因此,我從系統上的Vault寫入臨時文件,使用ruby_block計算md5,並在管理密鑰庫的execute塊的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跳過。 感謝您的幫助

+0

Mixlib :: ShellOut不需要被包裹在一個ruby_block,另外cur_md5 run_command在哪裏? –

+0

嗨,我想在我的情況下Mixlib :: ShellOut需要被包裝,因爲否則它將在編譯階段執行,並且此時/tmp.mycerrt.crt文件不存在。 cur_md5在之前運行,不包含在ruby塊中,因爲它測試了始終存在的密鑰庫。 –

回答

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它可以處理編譯階段生成的數據(這裏我生成本地文件)