Подтвердить что ты не робот

Кукольный тест, если пакет уже определен?

Я пишу некоторые кукольные модули и имею пакет, определенный в двух модулях, поэтому получаю следующую ошибку:

err: Could not retrieve catalog from remote server: Error 400 on SERVER: Duplicate definition: Package[gnome-session-fallback] is already defined in file /etc/puppet/modules/vnc4server/manifests/init.pp at line 3; cannot redefine at /etc/puppet/modules/vino/manifests/init.pp:7 on node l

Следовательно, убедитесь, что пакет еще не определен, но следующее не работает:

if ! defined ('gnome-session-fallback') {
    package { 'gnome-session-fallback':
        ensure => installed,
    }
}

Может ли кто-нибудь предложить, как исправить это и в более широком масштабе, что такое "правильный" подход, чтобы избежать столкновений, подобных этому в модулях?

4b9b3361

Ответ 1

Вам не хватает Package [] внутри defined(). Правильный способ сделать это:

if ! defined(Package['gnome-session-fallback']) {
    package { 'gnome-session-fallback':
        ensure => installed,
    }
}

Ответ 2

Самый чистый способ сделать это - использовать функцию ensure_resource из puppetlabs-stdlib:

ensure_resource('package', 'gnome-session-fallback', {'ensure' => 'present'})

Ответ 3

Чтобы ответить на мой собственный вопрос о том, что такое "правильный" подход: этот вопрос обсуждается на https://groups.google.com/forum/?fromgroups=#!topic/puppet-users/julAujaVsVk, а jcbollenger предлагает то, что выглядит как "лучшая практика" "Решение - ресурсы, которые определены несколько раз, должны быть перемещены в их собственный модуль и включены в классы, от которых они зависят. Я применил это и решил свою проблему.

На самом деле это не отвечает, почему "if! defined" не работает...

Ответ 4

Один более чистый способ (среди множества способов) - создать виртуальный пакетный ресурс, а затем реализовать его. Вы можете реализовать один и тот же виртуальный пакет несколько раз без ошибок.

@package { 'gnome-session-fallback':
    ensure => installed,
}

И тогда, где вам это нужно:

realize( Package[ 'gnome-session-fallback' ] )