在我正在工作的设置中,变量$ 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)
答案 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层次结构,以帮助您以较少的冗余定义节点数据。
看到你 显然正在使用类,这里有一些额外的规则应该让事情更清楚:
评估订单未发挥作用。范围规则始终适用。禁止在同一作用域上进行多次分配,并导致编译器错误。由于您没有面对这种情况,上述规则确实适用。
$foo = 'global'
# $foo == 'global'
node default {
$foo = 'node'
include bar
# $foo == 'node'
}
class bar {
$foo = 'class'
# $foo == 'class'
include baz
}
class baz {
# foo == 'node' (!)
}