Puppet无法找到模板的变量

fan*_*ngo 4 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
Run Code Online (Sandbox Code Playgroud)

还有其他的东西,但没有必要.

碱/舱单/ init.pp:

class base {
  include base::install, base::service, base::config, base::params
}
Run Code Online (Sandbox Code Playgroud)

碱/舱单/ 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"],
  }
...
Run Code Online (Sandbox Code Playgroud)

碱/舱单/ params.pp

class base::params {
  $puppetserver = "pup01.sdirect.lab"
}
Run Code Online (Sandbox Code Playgroud)

最后是base/templates/puppet.conf.erb中模板的有趣部分

...
server=<% puppetserver %>
Run Code Online (Sandbox Code Playgroud)

错误消息:

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

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

有人能告诉我应该定义$ puppetserver的位置以及如何定义?

Dom*_*eal 15

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

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

这意味着要访问它,您可以使用类名完全限定它:base::params::puppetserver.如果你在清单本身使用它,那就是$base::params::puppetserver.你会看到在临木偶类似的例子ssh::configssh::service阶级它是指"ssh_service_name"在PARAMS类(43-45页).

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

...
server=<%= scope.lookupvar("base::params::puppetserver") %>
Run Code Online (Sandbox Code Playgroud)

从2.7页开始,有关Scope和Puppet的作用域的更多信息.

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


qri*_*ris 6

答案#1在技​​术上是正确的,但会产生非常详细的模板.

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

class base::config {
  include base::params
  $puppetserver = $base::params::puppetserver
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

server=<% puppetserver %>
Run Code Online (Sandbox Code Playgroud)