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

марионетка: использование заглавных букв в определениях

В моих манифестах марионеток есть определение postgresql :: user

Я добавил следующее, чтобы марионетка не пыталась сделать что-то дважды:

if !defined (Postgresql::User["dbuser"]) { 
        postgresql::user { "dbuser": 
            ensure => present
        } 
    }

Однако я все еще получаю ошибки в puppetd --test

err: Could not retrieve catalog: Duplicate definition: Postgresql::User[dbuser] is already defined in file /etc/puppet/modules/dbserver/manifests/postgresql8-3.pp at line 22; cannot redefine at /etc/puppet/modules/dbserver/manifests/postgresql8-3.pp:7 on node mynode

У меня такое чувство, что ему не нравятся заглавные буквы и `:: 'при проверке, определены ли они. Есть ли способ избежать этого?

Проблема не в использовании заглавных букв, а в дублировании определения ресурса в /etc/puppet/modules/dbserver/manifests/postgresql8-3.pp. Вот простой манифест, демонстрирующий это:

define foo::bar {
  notify { $name: }
}

foo::bar { "hello": }

if !defined (Foo::Bar['hello']) {
  foo::bar { "hello": }
}

Если вы измените! Defined на определенный, вы увидите ошибку дублирования ресурса, аналогичную вашей ошибке. Я бы опубликовал ваш полный манифест, а не фрагмент.

Также попробуйте виртуальный ресурс (@type), если это проблема, когда два модуля должны реализовать один и тот же ресурс.