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

Puppet: массив в параметризованных классах VS с использованием ресурсов

У меня есть несколько случаев использования, когда я хочу определить несколько похожих ресурсов, которые должны оказаться в одном файле (через шаблон).

В качестве примера я пытаюсь написать модуль марионетки, который позволит мне управлять сопоставлением между 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.