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

Различные модули марионеток с одним общим ресурсом

Я пишу отдельные модули для разных ролей моих серверов. Так что у меня есть кукольный и марионетка-приборная панель-Модуль. В кукольный модуль гарантирует, что марионетка установлена ​​правильно. В марионетка-приборная панель делает то же самое для марионеточной панели, конечно.

Оба модуля нуждаются в исходном коде 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-источник на отдельный класс, а затем использовал бы включение или наследование (в зависимости от ситуации), чтобы вытащить этот класс туда, где он вам нужен.