Puppet 作为类名一部分的动态变量

Puppet 作为类名一部分的动态变量,puppet,Puppet,我尝试基于变量动态包含一个类,这很好,但是尝试在动态包含的类中查找一个变量却不行 class servers::something::something2( $query_cache_type = "Off", ) { $params_file = "servers::something::${::env}" include "${params_file}" $rp1 = "${params_file}::root_passwd" $rp2 = $serv

我尝试基于变量动态包含一个类,这很好,但是尝试在动态包含的类中查找一个变量却不行

class servers::something::something2(
  $query_cache_type = "Off",
  ) {
    $params_file = "servers::something::${::env}"
    include "${params_file}"
    $rp1 = "${params_file}::root_passwd"
    $rp2 = $servers::something::dev::root_passwd
    notify{"The value is: ${params_file}": }
    notify{"The value is: ${rp1}": }
    notify{"The value is: ${rp2}": }

}
给我这样的输出:

Notice: The value is: servers::mysql::dev
Notice: The value is: servers::mysql::dev::root_passwd
Notice: The value is: some_pass

如何使rp1(值的动态查找)正常工作?

您可以使用内联模板评估双重替换:

class servers::something::something2(
  $query_cache_type = "Off",
  ) {
    $params_file = "servers::something::${::env}"
    include "${params_file}"
    $rp1 = inline_template("<%= scope.lookupvar('${params_file}::root_passwd') %>")
    $rp2 = $servers::something::dev::root_passwd
    notify{"The value is: ${params_file}": }
    notify{"The value is: ${rp1}": }
    notify{"The value is: ${rp2}": }

}
类服务器::某物::某物2(
$query\u cache\u type=“Off”,
) {
$params_file=“servers::something::${::env}”
包括“${params_file}”
$rp1=内联_模板(“”)
$rp2=$servers::something::dev::root\u passwd
通知{“值为:${params_file}”:
通知{“值为:${rp1}”:
通知{“值为:${rp2}”:
}

但是对于这个用例,似乎更适合使用
hiera
来保持环境配置

而不是使用内联模板,因为它提供了许多优秀的功能,比如

一旦你做到了这一点,你可以简单地写

$rp1 = getvar("${params_file}::root_passwd")
你就完了。以下是一个例子:

class x::y {
  $z = "hello world"
}
include x::y    
$i = "x::y"
alert( getvar ( "${i}::z" ) ) # outputs "hello world"

如果您愿意为不同的环境维护不同的变量值,请考虑使用<代码> HILA/<代码>,如果动态的包括InLyIn模板HACK似乎是唯一的方法。也许我只需要在更通用的params.pp中进行环境切换,servers::something::something 2可以只包含servers::something::params