刚刚开始使用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以及如何定义?
答案 0 :(得分:15)
问题是名称“puppetserver”需要完全限定,因此Puppet可以找到该值,因为它的定义范围与模板评估的范围不同。
变量在base::params
中定义,因此在该范围内只能简称为“puppetserver”。当您在base::config
内评估模板时,您处于不同的范围内,因此您无法仅通过其简称来引用该变量。 “include”将其他类添加到目录中,但不会更改这些规则。
这意味着要访问它,您可以使用类名base::params::puppetserver
完全限定它。如果您在清单中使用它,那将是$base::params::puppetserver
。您将在ssh::config
和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上列出了相同的解决方案。)
答案 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
。