Типы кукол используются для индивидуального управления конфигурацией. Puppet имеет разные типы, такие как тип сервиса, тип пакета, тип провайдера и т. Д. В каждом типе есть провайдеры. Поставщик обрабатывает конфигурацию на разных платформах или инструментах. Например, тип пакета имеет провайдеров aptitude, yum, rpm и DGM. Существует много типов, и Puppet предлагает хороший элемент управления конфигурацией спектра, которым необходимо управлять.
Puppet использует Ruby в качестве базового языка. Все присутствующие типы Puppet и провайдеры написаны на языке Ruby. Поскольку он соответствует стандартному формату кодирования, их можно просто создать, как показано в примере для репо, который управляет репозиториями. Здесь мы создадим репо типа и провайдеры svn и git. Первая часть типа репо — это сам тип. Типы обычно хранятся в lib / puppet / type. Для этого мы создадим файл с именем repo.rb.
$ touch repo.rb
Добавьте следующее содержимое в файл.
Puppet::Type.newtype(:repo) do @doc = "Manage repos" Ensurable newparam(:source) do desc "The repo source" validate do |value| if value =~ /^git/ resource[:provider] = :git else resource[:provider] = :svn end end isnamevar end newparam(:path) do desc "Destination path" validate do |value| unless value =~ /^\/[a-z0-9]+/ raise ArgumentError , "%s is not a valid file path" % value end end end end
В приведенном выше сценарии мы создали блок « Puppet :: Type.newtype (: repo) do », который создает новый тип с именем repo. Затем у нас есть @doc, который помогает добавлять любой уровень детализации, который вы хотите добавить. Следующее утверждение является Ensurable; это создает базовое свойство обеспечения. Тип Puppet использует свойство sure для определения состояния элемента конфигурации.
пример
service { "sshd": ensure => present, }
Оператор обеспечивает сообщает Puppet, кроме трех методов: создавать, уничтожать и существовать в поставщике. Эти методы предоставляют следующие функции —
- Команда для создания ресурса
- Команда для удаления ресурса
- Команда для проверки существования ресурса
Все, что нам нужно сделать, это указать эти методы и их содержимое. Puppet создает поддерживающую инфраструктуру вокруг них.
Далее мы определяем новый параметр с именем source.
newparam(:source) do desc "The repo source" validate do |value| if value =~ /^git/ resource[:provider] = :git else resource[:provider] = :svn end end isnamevar end
Источник сообщит типу репозитория, где получить / клонировать / оформить исходный репозиторий. В этом мы также используем хук под названием validate. В разделе провайдера мы определили git и svn, которые проверяют правильность определенного нами репозитория.
Наконец, в коде мы определили еще один параметр, называемый path.
newparam(:path) do desc "Destination path" validate do |value| unless value =~ /^\/[a-z0-9]+/ raise ArgumentError , "%s is not a valid file path" % value end
Это тип значения, который указывает, куда поместить новый код, который будет получен. Здесь снова используйте ловушку validate для создания блока, который проверяет значение соответствия.
Вариант использования Subversion Provider
Давайте начнем с провайдера Subversion, используя созданный выше тип.
require 'fileutils' Puppet::Type.type(:repo).provide(:svn) do desc "SVN Support" commands :svncmd => "svn" commands :svnadmin => "svnadmin" def create svncmd "checkout", resource[:name], resource[:path] end def destroy FileUtils.rm_rf resource[:path] end def exists? File.directory? resource[:path] end end
В приведенном выше коде мы заранее определили, что нам нужна библиотека fileutils , для которой требуется ‘fileutils’, с которой мы собираемся использовать метод.
Далее мы определили провайдера как блок Puppet :: Type.type (: repo) .provide (: svn) do, который сообщает Puppet, что это провайдер для типа с именем repo.
Затем мы добавили desc, который позволяет добавить некоторую документацию к провайдеру. Мы также определили команду, которую будет использовать этот поставщик. В следующей строке мы проверяем функции ресурса, такие как создание, удаление и существование.
Создание ресурса
Как только все вышеперечисленное будет выполнено, мы создадим ресурс, который будет использоваться в наших классах и файлах манифеста, как показано в следующем коде.