Как написать класс-оболочку/конфигурацию переопределения в ранее существующем классе Puppet

Я хотел бы переопределить значения другого класса в других модулях Puppet. Пожалуйста, помогите мне, предложив способы.

Существующий класс: (имя модуля: MySQL)

class mysql::server (
  $config_file             = $mysql::params::config_file,
  $includedir              = $mysql::params::includedir)
{
  My Code Logics
}

Мой текущий класс: (Название модуля: Профили)

Class profiles::mysql () {
    class { '::mysql::server':
        config_file => '/opt/arunraj',
        includedir  => true
    }
}

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


person ArunRaj    schedule 04.02.2016    source источник


Ответы (1)


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

Также обратите внимание, что использование объявлений классов в стиле ресурсов обычно является плохой формой, особенно для объявления общедоступных классов любого модуля, и особенно для объявления классов, принадлежащих другому модулю, чем тот, в котором появляется объявление. Причины немного технические, но в значительной степени они сводятся к риску вызвать именно ту ошибку, с которой вы столкнулись. Это происходит всякий раз, когда Puppet оценивает объявление в стиле ресурса класса, для которого объявление (в любом стиле) уже было оценено, потому что значения параметров класса связаны как часть оценки первого обнаруженного объявления.

Лучший способ настроить значения параметров класса — полагаться на автоматическую привязку данных (Hiera) для привязки значений к этим параметрам в первую очередь. Если у вас есть странная машина, которой нужны другие значения параметров, вы устанавливаете их на более высоком уровне иерархии данных, чем тот, из которого берутся обычные значения, и который имеет достаточно узкую область действия, чтобы не влиять на машины, которые должны иметь обычные значения. параметры.

Более того, чтобы избежать описанной вами ошибки, вы также должны быть уверены, что везде используете только включения-подобные объявления для любого класса, который может быть объявлен более одного раза (т. е. любой общедоступный и некоторые частные). Это идет рука об руку с автоматической привязкой, потому что, если вы не используете ресурсоподобные объявления, то автоматическая привязка данных является вашим лучшим доступным средством для настройки значений параметров класса. Классическое объявление стиля включения осуществляется через саму функцию include, но функции require, contain и hiera_include также предоставляют объявления стиля включения (с различными различиями в семантике). Если вы используете ENC для объявления классов, он может создать любой стиль.

person John Bollinger    schedule 04.02.2016
comment
Пожалуйста, поправьте меня, если я ошибаюсь. Затем Как написать расширение/оболочку с существующими модулями. Потому что, если мы выберем включаемое объявление. Мы не можем переопределить нашу новую настройку / Мы будем ограничены некоторым уровнем. Я прав ? Если я ошибаюсь, можете ли вы объяснить какие-либо образцы? - person ArunRaj; 05.02.2016
comment
@ArunRaj, я повторяю: настройка параметров класса для всех общедоступных классов должна выполняться с помощью автоматической привязки данных, что означает Hiera. В Hiera вы можете предоставлять настраиваемые данные с любой степенью специфичности, которая вам нравится, вплоть до отдельных машин. Однако я не могу ответить на ваш вопрос о том, как писать расширения или оболочки, потому что неясно, что именно это значит для вас, и в любом случае это кажется слишком широким и открытым для SO. - person John Bollinger; 05.02.2016
comment
forge.puppetlabs.com/puppetlabs/mysql Я пытаюсь написать собственный класс профиля для код выше. И я хотел бы настроить значения через класс моего профиля вместо существующего класса Mysql::server, также я не хочу влиять на существующий модуль. Другими словами, я хотел бы повторно использовать существующую функциональность с моими новыми значениями конфигурации в новом классе. Я действительно уверен, является ли это широким или коротким вопросом. Буду признателен за любую оказанную помощь. - person ArunRaj; 08.02.2016