动态访问 Puppet 类变量

动态访问 Puppet 类变量

是否可以动态访问类中的变量?例如:

class namespace::hello() {
    $cow = "moo"
    $dog = "bark"
}

$dynamic = 'cow'
$value = $namespace::hello::[$dynamic]  # doesn't work

我这样做是因为我为每个环境定义了带有变量的类,例如:

class company::env::production {
    $dns = "1.2.3.4"
}

class company::env::office {
    $dns = "2.3.4.5"
}

答案1

我找到了一个糟糕的解决方案。我希望有人能给我一个更好的选择。

通过使用inline_templatewith scope.lookupvar,您可以引用动态变量:

inline_template("<%= scope.lookupvar('$namespace::hello::${dynamic}') %>")

更新

由于解决方案的复杂性,我只能在该 hack 的基础上进行 hack。我创建了一个自定义函数,它只执行以下一行代码:

module Puppet::Parser::Functions
  newfunction(:config, :type => :rvalue) do |arguments|

    if arguments.size != 2
      raise(Puppet::ParseError, "config(): 2 args required)")
    end

    env = arguments[0]
    var = arguments[1]

    lookupvar("::company::env::#{env}::#{var}")
  end
end

在你的.pp

$dns_server = config("production", "dns_server")

相关内容