Puppet - 应用节点时的变量优先级

时间:2014-08-26 08:49:38

标签: variables puppet

在我正在工作的设置中,变量$ var1在几个地方声明。但是我不确定最后应用哪一行。结构如下。

puppet模块module1包含一个vars.pp类,它由init.pp清单继承。在vars.pp中,var1声明为“value-vars”。

#vars.pp
$var1 = "value-vars"

此模块适用于与nodes.pp中定义的某个正则表达式匹配的任何节点。

#nodes.pp
node "/nodepattern/" inherits base {
require module1
}

nodes.pp继承自base.pp,它将var1声明为“value-base”。

#base.pp
$var1 = "value-base"

现在,当模块应用于某个节点时,var1包含什么值?

它是“value-vars”,因为节点块是在类之前应用的吗?

更新

├── puppet3
│   ├──**manifests**
│   │   └───**nodes**
│   │     └──base.pp (node "base", $var1 = "value-base") 
│   ├──nodes.pp (various nodes inheriting base node, contains module1 node)
│   ├──**modules**
│   │    ├──**module1**
│   │    │    ├──**manifests**
│   │             ├──vars.pp (class "vars", $var1 = "value-vars")
│   │             ├──init.pp (class "module1", inherits vars class)

1 个答案:

答案 0 :(得分:0)

我在这里感到有些困惑。清单不能继承"另一个表现。更糟糕的是 - 从Puppet 4.0,清单文件甚至无法import另一个。

这留下了稀缺的选项来声明全局范围的变量。您应该避免在不同的.pp文件中全局声明相同的变量,因为任何导入这两个文件的编译都将失败!

结构类似于"如果此节点包含模块A,则将值X用于变量N" Puppet非常棘手。如果您可以依赖一个中心信息,那么清单效果最好,例如

node <long-cloud-instance-name-here> {
    $uses_app_foo = true
    $is_master_server = false
    include my_cloud_app
}

包含模块A和将X赋值给N的决定都应该基于那些节点范围变量。

此模式因大量节点而变旧。因此,建议设计Hiera层次结构,以帮助您以较少的冗余定义节点数据。

更新

看到你 显然正在使用类,这里有一些额外的规则应该让事情更清楚:

  1. 在本地范围(类或定义主体)中声明的变量隐藏来自更广泛的共享其名称的范围的变量
  2. 在节点块中声明的变量隐藏了具有相同名称的全局变量
  3. 评估订单未发挥作用。范围规则始终适用。禁止在同一作用域上进行多次分配,并导致编译器错误。由于您没有面对这种情况,上述规则确实适用。

    $foo = 'global'
    
    # $foo == 'global'
    
    node default {
        $foo = 'node'
        include bar
        # $foo == 'node'
    }
    
    class bar {
        $foo = 'class'
        # $foo == 'class'
        include baz
    }
    
    class baz {
        # foo == 'node' (!)
    }