У меня есть несколько случаев использования, когда я хочу определить несколько похожих ресурсов, которые должны оказаться в одном файле (через шаблон).
В качестве примера я пытаюсь написать модуль марионетки, который позволит мне управлять сопоставлением между MAC-адресами и именами сетевых интерфейсов (написание файла с постоянными сетевыми правилами udev из марионетки), но есть также много других подобных случаев использования.
Я поискал и обнаружил, что это можно сделать с новым параметризованные классы синтаксис: если реализован таким образом, он должен в конечном итоге использоваться следующим образом:
node { "myserver.example.com":
class { "network::iftab":
interfaces => {
"eth0" => { "mac" => "ab:cd:ef:98:76:54" }
"eth1" => { "mac" => "98:76:de:ad:be:ef" }
}
}
}
Не так уж плохо, я согласен, но он быстро взорвется, когда вы будете управлять более сложными вещами (подумайте о сетевых конфигурациях как в этом модуле или любой другой несколько сложных ресурсов в одном файле конфигурации прочее).
В аналогичный вопрос по SF кто-то предложил использовать Модуль puppet-concat Пиенаара но я сомневаюсь, что это может быть лучше, чем параметризованные классы.
Что было бы действительно круто и чисто в определении конфигурации, было бы что-то вроде включенный тип хоста, его использование простое, красивое и чистое и, естественно, сопоставляется с несколькими ресурсами, которые в конечном итоге будут настроены в одном месте. Перенесенный на мой пример, это будет примерно так:
node { "myserver.example.com":
interface {
"eth0":
"mac" => "ab:cd:ef:98:76:54",
"foo" => "bar",
"asd" => "lol",
"eth1":
"mac" => "98:76:de:ad:be:ef",
"foo" => "rab",
"asd" => "olo",
}
}
... это выглядит намного лучше для моих глаз, даже с 3x опциями для каждого ресурса.
Должен ли я действительно передавать массивы параметризованным классам или есть лучший способ делать такие вещи? Есть ли общепринятый консенсус в марионеточном сообществе [пользователей | разработчиков]?
Кстати, я имею в виду последнюю стабильную версию ветки 2.7 и меня не интересует совместимость со старыми версиями.
Я думаю, что ты ищешь Типы. Типы предоставят вам желаемый синтаксис, и вы можете использовать один и тот же тип несколько раз на одном и том же хосте для настройки нескольких интерфейсов, чего нельзя сделать с классами.
Вы можете создавать новые типы с помощью Определенные типы, которые написаны на Puppet DSL. Дополнительная информация об определенных типах есть Вот. Другой способ создания типов - использовать Пользовательские типы, которые написаны на Ruby.
Примеры типов определений см. puppetlabs-apt, ripienaar-concat, и бритва-сеть. Хорошие примеры таможенных типов: Puppetlabs-firewall и puppetlabs-vcsrepo.