Ответ 1
Вам не хватает Package [] внутри defined(). Правильный способ сделать это:
if ! defined(Package['gnome-session-fallback']) {
package { 'gnome-session-fallback':
ensure => installed,
}
}
Я пишу некоторые кукольные модули и имею пакет, определенный в двух модулях, поэтому получаю следующую ошибку:
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,
}
}
Может ли кто-нибудь предложить, как исправить это и в более широком масштабе, что такое "правильный" подход, чтобы избежать столкновений, подобных этому в модулях?
Вам не хватает Package [] внутри defined(). Правильный способ сделать это:
if ! defined(Package['gnome-session-fallback']) {
package { 'gnome-session-fallback':
ensure => installed,
}
}
Самый чистый способ сделать это - использовать функцию ensure_resource
из puppetlabs-stdlib:
ensure_resource('package', 'gnome-session-fallback', {'ensure' => 'present'})
Чтобы ответить на мой собственный вопрос о том, что такое "правильный" подход: этот вопрос обсуждается на https://groups.google.com/forum/?fromgroups=#!topic/puppet-users/julAujaVsVk, а jcbollenger предлагает то, что выглядит как "лучшая практика" "Решение - ресурсы, которые определены несколько раз, должны быть перемещены в их собственный модуль и включены в классы, от которых они зависят. Я применил это и решил свою проблему.
На самом деле это не отвечает, почему "if! defined" не работает...
Один более чистый способ (среди множества способов) - создать виртуальный пакетный ресурс, а затем реализовать его. Вы можете реализовать один и тот же виртуальный пакет несколько раз без ошибок.
@package { 'gnome-session-fallback':
ensure => installed,
}
И тогда, где вам это нужно:
realize( Package[ 'gnome-session-fallback' ] )