2012-05-14 145 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 ñ在这个班。