2017-07-30 81 views
0

我試圖創建一個新的自定義類型/提供程序,但不能保證。自定義類型/提供程序不可接受

我已經檢查過exec和augeas類型,但我無法清楚地弄清楚,當我們沒有定義可保證模式時,類型和提供程序之間的集成是如何工作的。

類型:

Puppet::Type.newtype(:ptemplates) do 

    newparam(:name) do 

    desc "" 

    isnamevar 

    end 

    newproperty(:run) do 

    defaultto 'now' 

    # Actually execute the command. 
    def sync 
     provider.run 
    end 

    end 

end 

提供者:

require 'logger' 

Puppet::Type.type(:ptemplates).provide(:ptemplates) do 

    desc "" 

    def run 

     log = Logger.new(STDOUT) 
     log.level = Logger::INFO 

     log.info("x.....................................") 

    end 

但我不知道爲什麼正在執行的供應商兩次

[email protected]:/# puppet apply -e "ptemplates { '/tmp': }" --environment=production 
Notice: Compiled catalog for puppet.localhost in environment production in 0.12 seconds 
I, [2017-07-30T11:00:15.827103 #800] INFO -- : x..................................... 
I, [2017-07-30T11:00:15.827492 #800] INFO -- : x..................................... 
Notice: /Stage[main]/Main/Ptemplates[/tmp]/run: run changed 'true' to 'now' 
Notice: Applied catalog in 4.84 seconds 

而且,我有來定義defaultto強制執行provider.run方法。

我錯過了什麼?

最好的問候。

+0

爲什麼不使用普通的方法來強制執行,如將冪等設置爲false或使用'exists/creates''? –

+0

爲什麼你認爲(而不是)「可接受」與你的問題有什麼關係? –

回答

0

首先,你應該花一些時間閱讀這個博客http://garylarizza.com/blog/2013/11/25/fun-with-providers/和加里Larizza以下兩個。它給傀儡類型/提供者一個很好的介紹。

由於調用運行定義的類型中的def同步,您的日誌正在執行兩次,當puppet嘗試確定運行屬性的值時,第二次執行。

爲了寫一個類型/供應商未ensurable你需要做的是這樣的:

類型:

Puppet::Type.newtype(:ptemplates) do 
    @doc = "" 

    newparam(:name, :namevar => true) do 
    desc "" 
    end 

    newproperty(:run) do 
    desc "" 
    newvalues(:now, :notnow) 
    defaultto :now 
    end 
end 

提供者:

Puppet::Type.type(:ptemplates).provide(:ruby) do 
    desc "" 

    def run 
    #Do something to determine if run value and is now or notnow and return it 
    end 

    def run= value 
    #Do something to set the value of run 
    end 
end 

注所有類型的提供者必須能夠確定財產的價值並能夠設置它。可接受的和不可接受的類型/提供者之間的區別在於,可接受的類型/證明者能夠創建並銷燬它,fx刪除用戶或添加用戶。不能保證的類型/提供者不能創建和銷燬屬性,fx selinux,你可以設置它的值,但是你不能刪除selinux。

相關問題