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

Puppet 3.0: должен ли я вызывать модуль из подкласса с аналогичным названием другого модуля?

У меня есть модуль с именем 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,
}