2016-07-06 125 views
0

我有一個自定義資源(在一個名爲dsc_class.rb的文件中的cookbook/resources文件夾中)。基本上,這是一種無需安裝和使用完整DSC引擎即可輕鬆調用DSC類資源的方法。廚師自定義資源衛士

resource_name :dsc_class 

default_action :create 

property :file_name, kind_of: String, required: true, name_property: true 

action :create do 
    powershell_script file_name do 
    cwd ::File.dirname(file_name) 
    code <<-EOH 
    gc "#{file_name}" -Raw | iex 
    $o = New-Object #{file_name.split('/').last.split('.').first} 
    $o.Set() 
    EOH 
    not_if <<-EOH 
    gc "#{file_name}" -Raw | iex 
    $o = New-Object #{file_name.split('/').last.split('.').first} 
    o.Test() 
    EOH 
    end 
end 

偉大的作品 - 但在資源警衛和PowerShell腳本不執行,我在日誌/輸出到廚師的客戶端運行得到「更新X資源」的行動總是「執行」,這樣的事件。

如何在自定義資源中適當保護?

UPDATE:配方中含有

dsc_class "/install/dsc/MyDscResource.ps1" 
+0

你的配方代碼是什麼?應該像其他資源一樣應用於custom_resource – Tensibai

+0

但要真正回答您,您應該實現'load_current_resource'並使用[converge_if_changed',如[here]所示(https://docs.chef.io/custom_resources.html#converge如果改變),並擺脫你的PowerShell資源中的守衛。在答案中引用文檔聽起來毫無用處。 – Tensibai

+0

如果我這樣做,我如何在沒有powershell_script資源的情況下調用powershell腳本塊? – Jeff

回答

1

powershell_script是像所有其他execute式的資源,它始終運行命令/腳本/不管,並依靠外部級not_ifonly_if條款。在這種情況下,您可以將dsc_class資源實例放在配方代碼中。

+0

是不是這些資源上'not_if'守護的原因?不執行它們,因此在guard命令返回true時不將它們標記爲已更新(或者當它是一個字符串時爲0)。我不明白。 – Tensibai

+0

你是對的,但它仍然說x資源收斂。任何想法爲什麼? – Jeff

+0

編譯配方時,所有資源都會添加到集合中。警衛防止行動發生,但它仍然存在於總數中。 – coderanger