2012-05-14 291 views
3

剛開始使用木偶,我遇到了第一個模板的問題。這應該很容易,但我無法弄清楚。木偶無法找到模板變量

我有一個模塊「基地」在

/etc/puppet/modules/base/ 
    ./manifests 
    ./manifests/service.pp 
    ./manifests/init.pp 
    ./manifests/params.pp 
    ./manifests/config.pp 
    ./manifests/install.pp 
    ./templates 
    ./templates/puppet.conf.erb 

還有其他的東西,但它是沒有必要的。

鹼/艙單/ init.pp:

class base { 
    include base::install, base::service, base::config, base::params 
} 

鹼/艙單/ config.pp

class base::config { 
    include base::params 

    File { 
    require => Class["base::install"], 
    ensure => present, 
    owner => root, 
    group => root, 
    } 

    file { "/etc/puppet/puppet.conf": 
    mode => 0644, 
    content => template("base/puppet.conf.erb"), 
    require => Class["base::install"], 
    nofity => Service["puppet"], 
    } 
... 

鹼/艙單/ params.pp

class base::params { 
    $puppetserver = "pup01.sdirect.lab" 
} 

最後有趣部分模板位於base/templates/puppet.conf.erb

... 
server=<% puppetserver %> 

錯誤消息:

ERR:解析失敗模板鹼/ puppet.conf.erb:未能找到在 的/ etc /木偶/模塊/鹼/艙單 'puppetserver' 值/config.pp:13節點上...

我不明白問題所在。我直接從Pro Puppet書中複製了這部分內容。

有人可以告訴我$ puppetserver應該在哪裏定義,以及如何?

回答

14

的問題是,名爲「puppetserver」必須是完全合格的,以便木偶可以找到價值,因爲它在不同範圍的一個模板進行評估的已定義。

的變量定義base::params所以在這個範圍內只能簡稱爲「puppetserver」。當您在base::config內對模板進行評估時,您處於不同的範圍內,因此您無法簡單地通過短名稱來引用該變量。 「include」將其他類添加到目錄中,但不會更改這些規則。

這意味着要訪問它,您完全有資格使用類名稱:base::params::puppetserver。如果你在清單本身使用它,這將是$base::params::puppetserver。您會在和ssh::service類中的Pro Puppet中看到類似的例子,它在params類中引用了「ssh_service_name」(第43-45頁)。

要訪問模板中的變量,它有點不同,請使用scope.lookupvar("base::params::puppetserver")。以您的完整的例子,並添加缺少等號(輸出值)模板:

... 
server=<%= scope.lookupvar("base::params::puppetserver") %> 

有一個關於劃定範圍的Scope and Puppet as of 2.7頁面上提供更多的信息。

(編輯:看起來像它在confirmed errata page上也有同樣的解決方案。)

+0

非常感謝。 scope.lookupvar完美工作。我不得不在base :: config中的初始類定義之後添加「include base :: params」。 – fandingo

6

Answer #1在技術上是正確的,但會產生非常詳細的模板。

您可以通過將其他類別的變量值到自己的類範圍縮短他們:

class base::config { 
    include base::params 
    $puppetserver = $base::params::puppetserver 
    ... 
} 

,然後在模板中使用它們預期:

server=<% puppetserver %> 
1

您也可以使用繼承:

class puppet::config inherits puppet::params { 
.... 

這樣你就不必定義$puppetserver agai ñ在這個班。