2015-06-11 112 views
2

在我的木偶模塊,我有這樣的事情:傀儡木偶聯模板:// URL中

file {'myfile': 
    ensure => 'file', 
    path => '/whatever/myfile', 
    content => inline_template(file(
    "puppet:///modules/my_module/templates/${domain}/${::hostname}_myfile.erb", 
    "puppet:///modules/my_module/templates/${domain}/myfile.erb" 
)) 
} 

而且我的規格看起來像:

require 'spec_helper' 

describe 'my_module' do 
    context 'with defaults for all parameters' do 
    it { should compile } 
    end 
end 

如果嘗試運行它,我得到:

Failure/Error: it { should compile } 
    error during compilation: Evaluation Error: Error while evaluating a Function Call, Could not find any files from puppet:///modules/my_module/templates/dev.contaazul.local/myfile.erb, puppet:///modules/my_module/templates/dev.contaazul.local/myfile.erb at /home/carlos/Code/Puppet/modules/my_module/spec/fixtures/modules/my_module/manifests/init.pp:48:33 on node becker.local 

顯然,它找不到任何ERB模板。如果我將puppet://部分替換爲/home/carlos/Code/Puppet/(代碼實際在其中),它會通過,但在生產中它是/etc/puppet/,因此它不起作用。

我該如何做這項工作?

回答

2

RI Pienaar發佈了一個code snippet用於此行爲的功能。您需要將此代碼複製到路徑lib/puppet/parser/functions/multi_source_template.rb的某個模塊中的某個文件中。

一旦你這樣做,你應該能夠使用它像這樣:

file {'myfile': 
    ensure => 'file', 
    path => '/whatever/myfile', 
    content => multi_source_template(
    "my_module/${domain}/${::hostname}_myfile.erb", 
    "my_module/${domain}/myfile.erb" 
) 
} 
+0

工作,非常感謝! – caarlos0

1

至於爲什麼原來的方法是行不通的:網址通常與source屬性只使用和轉讓代理人的情況。代理使用該URL並向Puppet文件服務器發送相應的請求(這只是另一個主服務器)。

另一方面file函數(此處使用的content屬性與inline_template一起使用)不會處理URL,而是需要本地路徑。

說了這麼多,通過指定測試框和生產系統的路徑,問題可能已經被側重於後者,後者只是承認/home/carlos丟失。但是,這遠遠不是一個乾淨的解決方案。