Назад | Перейти на главную страницу

Динамический доступ к переменной класса марионетки

Можно ли получить динамический доступ к переменной в классе? Например:

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")