无法从傀儡模板中找到VARIABLE的值

时间:2017-01-07 21:54:20

标签: templates puppet

我无法从Puppet模板中获取变量。

es_deploy.pp class

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 %>

我不知道为什么我无法直接从es_deploy类获取值。我使用scope.lookupvar()的解决方法来获取cluster_name,但它没有以相同的方式使用network_host。弹性搜索模板包含在define块中,我在其中设置了network_host变量,因此它应该是可访问的,但它不是。通知显示两个值都正确。

Puppet显示错误:

Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Failed to parse template elasticsearch/elasticsearch.erb:
Filepath: /usr/lib/ruby/vendor_ruby/puppet/parser/templatewrapper.rb
Line: 82
Detail: Could not find value for 'network_host' at /etc/puppet/environments/testing/modules/elasticsearch/templates/elasticsearch.erb:74
at /etc/puppet/environments/testing/modules/elasticsearch/manifests/es_deploy.pp:123 on node es1

我将不胜感激任何帮助,谢谢

1 个答案:

答案 0 :(得分:1)

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

Puppet语言参考包含a section on scoping rules,它解释了这一点。从Puppet 3.0开始,根据 static 作用域规则查找所有变量引用(应该是),尽管在这方面有一个关于模板引用的错误。参考文献的相关条款包括(强调原文):

  

类定义或定义类型中的代码存在于本地范围

中      

在本地范围内声明的变量和默认值仅在该范围及其子项中可用。

[...]

  

[版本3]的Puppet使用静态范围变量

[...]

  

静态范围中,父作用域仅由类继承分配(使用inherits关键字)。除了node和top scope的内容之外,任何派生的类都会接收其基类的内容。

     

所有其他本地范围没有父母 - 他们只收到自己的内容,节点范围的内容(如果适用)和顶级范围。

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

$cluster_name = $elasticsearch::es_deploy::cluster_name

然而,我的建议是继续让模板在适当的范围内查找变量,如果该范围确实可以被视为信息的规范来源。

我还应该说,在Puppet 3发布之前,类体内的嵌套类或定义的类型定义被广泛认为是不好的形式。即使在Puppet 2和更早版本中,它们依赖于动态范围,词法嵌套定义产生范围混乱。 Puppet 3(和4)文档特别指出该实践在该版本中已弃用,但警告它是未来弃用的候选者。另外,they explicitly say

  

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

     

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

我应该清楚,在上下文中,很明显,文档是区分的,应该&#34;来自&#34;必须&#34;在那些评论中。