Можно ли получить динамический доступ к переменной в классе? Например:
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"
}
Я нашел неприятное решение. Я надеюсь, что кто-нибудь может предложить мне лучшую альтернативу.
Используя inline_template
с участием scope.lookupvar
, вы можете ссылаться на динамическую переменную:
inline_template("<%= scope.lookupvar('$namespace::hello::${dynamic}') %>")
Обновить
Из-за сложности решения я просто сделал хак над этим хаком. Я создал специальную функцию, которая выполняет эту функцию:
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")