2016-07-06 6 views
0

私はカスタムリソースを持っています(私の料理本の/ resourcesフォルダー内のdsc_class.rbというファイルにあります)。基本的に、これは、DSCクラスリソースをインストールしたり、完全な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

レシピコードは何ですか? Guardsは他のリソースと同様にcustom_resourceに適用する必要があります。 – Tensibai

+0

本当にあなたに答えるには、[load_current_resource]を実装し、[こちら](https://docs.chef.io/custom_resources.html#converge)のように 'converge_if_changed'を使うべきです。 -if-changed)あなたのPowerShellリソースのガードを取り除く。ドキュメンテーションを回答で引用すると、非生産的なように聞こえます。 – Tensibai

+0

これを行うと、powershell_scriptリソースなしでpowershellスクリプトブロックを呼び出すにはどうすればよいですか? – Jeff

答えて

1

powershell_scriptが含まれている他のすべてのexecuteスタイルのリソースのようなものです、それは常にコマンドを実行します/スクリプト/何と外側のレベルnot_ifまたはonly_if句に依存しています。この場合は、それらをレシピコードのdsc_classリソースインスタンスに配置します。

+0

これらのリソースで 'not_if'ガードが行われた理由はありませんか?それを実行しないので、ガードコマンドがtrueを返したときに更新されたものとしてマークすることはできません(文字列の場合は0)。私はそこにそれを持っていない。 – Tensibai

+0

あなたは正しいですが、まだxリソースが収束していると言います。どんな考え? – Jeff

+0

レシピをコンパイルするときに、すべてのリソースがコレクションに追加されます。ガードはアクションが実行されるのを防ぎますが、合計カウントの目的のためにまだそこにあります。 – coderanger