gpt4 book ai didi

Puppet 找不到模板的变量

转载 作者:行者123 更新时间:2023-12-03 18:13:10 27 4
gpt4 key购买 nike

刚开始使用 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

还有其他东西,但没必要。

基础/ list /init.pp:
class base {
include base::install, base::service, base::config, base::params
}

基地/ list /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"],
}
...

基础/ list /params.pp
class base::params {
$puppetserver = "pup01.sdirect.lab"
}

最后,模板中有趣的部分位于 base/templates/puppet.conf.erb
...
server=<% puppetserver %>

错误信息:

err: Failed to parse template base/puppet.conf.erb: Could not find value for 'puppetserver' at /etc/puppet/modules/base/manifests/config.pp:13 on node ...



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

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

最佳答案

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

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

这意味着要访问它,您必须使用类名完全限定它:base::params::puppetserver .如果您在 list 本身中使用它,这将是 $base::params::puppetserver .您将在 ssh::config 的 Pro Puppet 中看到类似的示例。和 ssh::service在 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 上也列出了相同的解决方案。)

关于Puppet 找不到模板的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10589404/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com