Я пишу отдельные модули для разных ролей моих серверов. Так что у меня есть кукольный и марионетка-приборная панель-Модуль. В кукольный модуль гарантирует, что марионетка установлена правильно. В марионетка-приборная панель делает то же самое для марионеточной панели, конечно.
Оба модуля нуждаются в исходном коде puppetlabs apt (кстати, я использую https://github.com/puppetlabs/puppet-apt). Итак, у меня есть следующий определенный ресурс в кукольный и марионетка-приборная панель-модуль:
apt::source { "puppetlabs":
location => "http://apt.puppetlabs.com",
release => "squeeze",
repos => "main",
required_packages => true,
include_src => false,
key => "4BD6EC30",
key_server => "pgp.mit.edu",
}
Теперь у моего агента появляется следующая ошибка:
err: Could not retrieve catalog from remote server: Error 400 on SERVER: Duplicate declaration: Apt::Source[puppetlabs] is already declared in file /etc/puppet/modules/puppet/manifests/base.pp at line 27; cannot redeclare at /etc/puppet/modules/puppet-dashboard/manifests/init.pp:42 on node server123
Конкретные модули не зависят друг от друга. Поэтому я считаю правильным устанавливать зависимость этого подходящего источника отдельно в каждом модуле.
Обходной путь - переименовать один источник из puppetlabs
к puppetlabs2
или что-то как это. Но должно быть другое решение.
Мне любопытны ваши отзывы!
Всякий раз, когда у меня возникает эта проблема (особенно часто бывает с пакетами), я просто помещаю ресурс в класс, сам по себе:
class git {
package { 'git': ensure => installed, }
}
Затем я включаю класс вместо определения ресурса.
Следующая проблема: но они используются разными модулями! Да либо вставьте их common
или в каком-либо другом общем модуле для конкретного модуля (например, puppet-common
).
Есть несколько способов решить эту проблему. Я бы лично разделил ваш apt-источник на отдельный класс, а затем использовал бы включение или наследование (в зависимости от ситуации), чтобы вытащить этот класс туда, где он вам нужен.