У меня есть модуль с именем drbd
который мне нужно использовать в другом модуле с именем hacluster
. Первоначально я думал разделить вещи drbd в отдельный класс следующим образом:
modules/drbd/[stuff] # this is the DRBD module
modules/hacluster/manifests/init.pp # class hacluster { include hacluster::drbd }
modules/hacluster/manifests/drbd.pp # class hacluster::drbd
В hacluster::drbd
class устанавливает и настраивает DRBD следующим образом:
class hacluster::drbd {
class { 'drbd':
service_ensure => undef,
service_enable => false,
}
class { 'drbd::global_common':
...more stuff...
}
drbd::resource {'r0': ...stuff...}
drbd::resource {'r1': ...stuff...}
}
... но Puppet не любит, когда я вызываю модуль drbd из класса hacluster :: drbd:
Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Duplicate declaration: Class[Hacluster::Drbd] is already declared; cannot redeclare on node mynode.blabla
Я тривиально исправил это, переименовав свой класс из hacluster::drbd
к hacluster::drbdx
, но я все же хотел бы знать, есть ли способ вызвать модуль из подкласса с тем же именем, содержащегося в другом модуле. Я прочитал документацию, но не смог найти окончательного ответа.
Puppet предпочитает класс в текущем пространстве имен (hacluster::
), вместо того, чтобы вернуться к корню и разрешить оттуда. Хорошее описание в справочнике по языку под пространства имен и автозагрузка.
Решение состоит в том, чтобы явно ссылаться на пространство имен верхнего уровня с помощью ::
перед названием класса:
class { '::drbd':
service_ensure => undef,
service_enable => false,
}