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

Как установить переменные с помощью базового узла (в node.pp)?

Я пробую "Марионетку", и мне кажется, что это хорошо.

Мой вопрос очень простой, но я не могу ответить.

У меня есть файл "node.pp":

node basenode {
         include "dns"
#        include "ntp"
}


node 'myserver.domain.com' inherits basenode {
        $type_server = "client"
        include "ntp"
}

Я хотел бы объявить свою переменную "$ type_server" без объявления "include ntp" на каждом сервере. Я хотел бы, чтобы "basenode" включал "ntp" и использовал значение "$ type_server" в узле моего сервера.

Переменная используется в манифестах NTP.

Заранее спасибо.

Не используйте переменные - как сказал Шейн, область видимости переменных в Puppet - это FUBAR, и попытка использовать ее просто вызывает боль, страдание, тошноту, головные боли и, возможно, болезни сердца.

Вместо этого используйте определенные типы. Это то, для чего они созданы. Итак, вместо использования классов и включает везде, используйте определенный тип и передайте ему необходимые данные:

define ntp_server($type_server) {
    # Do all the things you'd normally do, using $type_server as needed
}

node 'myserver.domain.com' {
    ntp_server { ntp:
        type_server => "client"
    }
}

В масштабирование в марионетке немного .. не интуитивно понятно. Это поведение линейной оценки - поскольку наследование происходит до определения переменной, и классы, включенные в унаследованный класс, оцениваются немедленно, переменная устанавливается после Вы нуждаетесь в этом.

Вместо наследования попробуйте просто включить «базу» внизу каждого узла, чтобы она оценивалась после установки необходимых переменных. Это не очень объектно-ориентированный способ решения задач, но такое поведение области видимости не оставляет много вариантов.

node 'myserver.domain.com' {
    $type_server = "client"
    include basenode
}

Я знаю, что это довольно давно, но поскольку у меня были проблемы с этим, и я нашел эту ветку, она может быть полезна другим.

Вместо использования определенных типов или включения узла в узел - что, по-моему, не очень хорошо - я бы предложил использовать параметризованные классы. Используя это, автор мог бы продолжать использовать свои классы в обычном режиме, и эти классы имели бы лишь небольшую модификацию для получения переменных (которые они уже используют) в качестве параметров.

Так, например, вместо:

class foo {
  file { 'abc':
    path => "some/path"
    content => $content
  }
}

В нем могли быть:

class foo($content) {
  file { 'abc':
    path => "some/path"
    content => $content
  }
}

И используйте это так:

node 'myserver.domain.com' {
    class { 'foo':
        $content => "something pretty smart"
    }
}