2016-02-04 1 views
0

Я хотел бы переопределить значения другого класса в других модулях 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 
    } 
} 

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

ответ

1

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

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

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

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

+0

Пожалуйста, исправьте меня, если я ошибаюсь. Затем, как написать расширение/обертку с существующими модулями. Потому что, если мы идем для include-like декларации. Мы не можем переопределить нашу новую настройку/Мы будем ограничены на некоторый уровень. Я прав ? Если я ошибаюсь, можете ли вы объяснить все образцы? – ArunRaj

+1

@ArunRaj, повторяю: настройка параметров класса для всех публичных классов должна выполняться посредством автоматической привязки данных, что означает Hiera. Внутри Hiera вы можете предоставлять персонализированные данные с любой степенью специфичности, какой вам нравится, вплоть до машинного процесса.Однако я не могу ответить на вопрос о том, как писать «расширения» или «обертки», потому что неясно, что именно это означает для вас, и в любом случае оно кажется слишком широким и открытым для SO. –

+0

https://forge.puppetlabs.com/puppetlabs/mysql Я пытаюсь написать наш специальный класс профиля для вышеуказанного кода. И я хотел бы настроить значения через мой класс профиля вместо уже существующего класса Mysql :: server, и я не хочу влиять на существующий модуль. Другими словами, я хотел бы повторно использовать существующую функциональность с моими новыми значениями конфигурации в новом классе. Я действительно уверен, что это широкий или короткий предметный вопрос. Буду признателен за любую оказанную помощь. – ArunRaj