刚刚开始使用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::config和ssh::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的作用域的更多信息.
(编辑:看起来它也在确认的勘误表页面上列出了相同的解决方案.)
答案#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)