Templates 无法从Puppet模板中找到变量的值

Templates 无法从Puppet模板中找到变量的值,templates,puppet,Templates,Puppet,我无法从Puppet模板获取变量 es_deploy.pp类 class elasticsearch::es_deploy inherits elasticsearch { $cluster_name = 'cluster' notify { "Cluster_Name Value: $cluster_name": } $keys_cluster = keys($elasticsearch) deploy_on_host { $keys_cluster: es

我无法从Puppet模板获取变量

es_deploy.pp类

class elasticsearch::es_deploy inherits elasticsearch {

    $cluster_name = 'cluster'
    notify { "Cluster_Name Value: $cluster_name": }

    $keys_cluster = keys($elasticsearch)
    deploy_on_host { $keys_cluster: es => $elasticsearch; }

    define deploy_on_host ($es) {

    $keys_node = keys($es[$title])

    deploy_instances { $keys_node: node_info => $es[$title], es_hosts => $es['node_list']; }

    define deploy_instances ($node_info, $es_hosts) {

     file {"/etc/elasticsearch/elasticsearch.yml": 
       ensure => file,             
        mode => 644,
        owner => root,
        group => root,
        content  => template("elasticsearch/elasticsearch.erb");
     }

     $network_host = $node_info['ip_address']
     notify { "Network_Host Value: $network_host": }

   }
}
模板elasticsearch.erb

cluster.name: <%= scope.lookupvar("elasticsearch::es_deploy::cluster_name") -%> 
network.host: <%= @network_host %>

感谢您的帮助,您的模板无法直接访问类
elasticsearch::es_deploy
的变量,因为它未在该类的范围内调用。相反,它是在定义类型
elasticsearch::es_deploy::deploy_instances
的范围内调用的,这与
elasticsearch::es_deploy
的范围无关,尽管存在命名和词汇嵌套

Puppet语言引用包含,这解释了这一点。自Puppet 3.0以来,所有变量引用都(应该)根据静态范围规则进行查找,尽管在这方面曾经有一个关于模板引用的bug。参考文件中的相关规定包括(在原文中强调):

类定义或定义类型中的代码存在于局部范围中

在局部作用域中声明的变量和默认值仅在该作用域及其子作用域中可用

[……]

Puppet的[Version 3]对变量使用静态作用域

[……]

静态范围中,父范围仅由类继承指定(使用
继承
关键字)。任何派生的类除了接收节点和顶部作用域的内容外,还接收其基类的内容

所有其他本地作用域没有父级-它们只接收自己的内容,以及节点作用域(如果适用)和顶级作用域的内容

如果希望模板在从定义的类型实例调用时能够通过表达式
@cluster\u name
检索数据,则需要对应于该类型的局部变量。可以通过将其作为参数传递,或仅通过制作类变量的本地副本来实现:

$cluster_name = $elasticsearch::es_deploy::cluster_name
但是,我的建议是,如果该范围确实可以被视为信息的规范源,则继续让模板在适当的范围内查找变量


我还应该说,在Puppet3发布之前,在类主体中嵌套类或定义类型定义被广泛认为是糟糕的形式。即使在Puppet 2和更早版本中,由于它们完全依赖于动态范围,词汇嵌套定义也产生了范围混淆。Puppet 3(和4)文档特别指出,该版本中没有弃用该实践,但警告说它是未来弃用的候选者。还有:

定义的资源类型可以(也应该)存储在模块中。木偶 自动识别有效模块中的任何定义类型,并且可以 按名称自动加载它们

定义应存储在模块的
清单/
目录中 每个文件有一个定义,每个文件名都应该反映 其定义类型的名称


我应该清楚,在上下文中,很明显文档在这些注释中区分了“应该”和“必须”。

您有一个打字错误。它应该是
。您可能想阅读有关将ERB与Puppet一起使用的文档以了解更多信息。谢谢Matt,但这不是问题所在,当然我使用了
,可能有一个类似的简单错误,但此时我找不到它。使用类继承也可能会弄糟一些事情。几年来,Puppet一直不鼓励类继承。这里的解决方案似乎是肯定的,写得很好。谢谢John,你做得很好!
$cluster_name = $elasticsearch::es_deploy::cluster_name