В моих манифестах марионеток есть определение 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), если это проблема, когда два модуля должны реализовать один и тот же ресурс.