Puppet无法找到模板的变量

时间:2012-05-14 18:57:08

标签: puppet

刚刚开始使用Puppet,我的第一个模板出现问题。它应该很容易,但我无法弄清楚。

我在

有一个模块“基地”
/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 %>

错误消息:

  

错误:无法解析模板base / puppet.conf.erb:找不到   “puppetserver”的值为   节点上的/etc/puppet/modules/base/manifests/config.pp:13 ...

我不知道问题是什么。我直接从Pro Puppet书中复制了这部分内容。

有人可以告诉我应该在哪里定义$ puppetserver以及如何定义?

3 个答案:

答案 0 :(得分:15)

问题是名称“puppetserver”需要完全限定,因此Puppet可以找到该值,因为它的定义范围与模板评估的范围不同。

变量在base::params中定义,因此在该范围内只能简称为“puppetserver”。当您在base::config内评估模板时,您处于不同的范围内,因此您无法仅通过其简称来引用该变量。 “include”将其他类添加到目录中,但不会更改这些规则。

这意味着要访问它,您可以使用类名base::params::puppetserver完全限定它。如果您在清单中使用它,那将是$base::params::puppetserver。您将在ssh::configssh::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上列出了相同的解决方案。)

答案 1 :(得分:6)

Answer #1在技术上是正确的,但会产生非常详细的模板。

您可以通过将其他类的变量值放入您自己的类范围来缩短它们:

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

然后按预期在模板中使用它们:

server=<% puppetserver %>

答案 2 :(得分:1)

您也可以使用继承:

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

通过这种方式,您无需在此课程中再次定义$puppetserver