Я пробую "Марионетку", и мне кажется, что это хорошо.
Мой вопрос очень простой, но я не могу ответить.
У меня есть файл "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"
}
}