4

刚开始使用 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:在节点上的 /etc/puppet/modules/base/manifests/config.pp:13 找不到“puppetserver”的值 ...

我不明白问题是什么。我直接从 Pro Puppet 书中复制了这一部分。

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

4

3 回答 3

16

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

该变量是在其中定义的,base::params因此在该范围内只能简单地称为“puppetserver”。当您从 inside 评估模板时base::config,您处于不同的范围内,因此您不能仅通过其短名称来引用该变量。“包含”将另一个类添加到目录中,但不会更改这些规则。

这意味着要访问它,您必须使用类名来完全限定它:base::params::puppetserver。如果您在清单本身中使用它,这将是$base::params::puppetserver. 您将在 Pro Puppet 的ssh::configssh::service类中看到类似的示例,其中它在 params 类中引用“ssh_service_name”(第 43-45 页)。

要访问模板中的变量,它有点不同,请使用scope.lookupvar("base::params::puppetserver"). 以您的完整示例并在模板中添加缺少的等号(以输出值):

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

从 2.7 开始,Scope and Puppet页面上有更多关于范围界定的信息。

(编辑:看起来它也以相同的解决方案列在已确认的勘误表页面上。)

于 2012-05-14T22:01:18.160 回答
6

答案 #1在技术上是正确的,但会导致模板非常冗长。

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

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

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

server=<% puppetserver %>
于 2013-08-12T17:26:19.710 回答
1

您还可以使用继承:

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

这样你就不必$puppetserver在这个类中再次定义了。

于 2014-10-05T20:48:15.230 回答