2016-09-19 64 views
0

我正在使用Puppet將證書從Puppet Server傳輸到Windows節點。 Puppet Server有一個文件夾,其中新的證書正從我的CA(另一臺服務器)複製。因此,有時Puppet可能找不到節點的證書(它不從CA轉移到源目錄),這就是爲什麼我需要額外檢查源文件夾中的證書狀態。代碼必須檢查主機名,找到適當的證書並將其傳輸到節點。在我試圖複製它之前,我怎樣才能在模塊文件目錄(puppet:/// modules/modulename /)中檢查證書的存在?在複製之前檢查木偶模塊文件源

file { "D:\$hostname.pfx": 
    ensure => present, 
    source => all, 
exec { 'Import certificate': 
    command => "if((Get-ChildItem -Path Cert:\LocalMachine\My\ | ? {$_.Issuer -like "*CN=example*"}).HasPrivateKey | select-string -pattern "True") -or()\ 
       {\$pwd = ConvertTo-SecureString -String "Password" -Force –AsPlainText; Import-PfxCertificate –FilePath ${cert_path}\$hostname.pfx cert:\localMachine\my -Password \$pwd}", 
    path  => $::path, 
    onlyif => "Test-Path ${cert_path}\${hostname}.pfx", 
    provider => 'powershell', 
    } 
+0

這與最佳實踐相去甚遠。你有這樣做的理由嗎? –

+0

嗯,是的,有一個實施這樣一個奇怪的解決方案的原因。 –

+0

您所提問的內容與您提供的(語法錯誤)代碼有何關係? –

回答

0

我怎樣才能使它檢查模塊文件目錄證書存在(木偶:///模塊/模塊名/)之前,我嘗試複製呢?

你可以寫一個custom function,檢查在模塊目錄中的文件,並用它來啓用或抑制FileExec資源的聲明。使用該功能的清單可能是這個樣子:

if module_file_exists("${hostname}.pfx") { 
    file { "D:\$hostname.pfx": 
    # ... 
    } 
    --> 
    exec { 'Import certificate': 
    # ... 
    } 
} 

或做同樣的事情會通過Ruby的小腳本在ERB模板代碼,您通過inline_template()運行來實現它的快速和骯髒的方式(或template())。

或者稍微更深奧的解決問題的方法是編寫一個自定義的Hiera後端,提供有關本地(到目錄編譯器)文件系統的信息,並通過hiera()函數訪問它。

但是,您是否認爲沒有做任何有條件的事情,而只是在證書文件不可用的情況下讓資源的應用失敗?如果實際上您關心證書是否已安裝,那麼資源應用程序失敗會爲您提供重要信息。我想你照顧,因爲如果你沒有,那麼它會更容易四處簡單地不打擾證書。