Dans ma configuration Puppet, je veux dire "Si je déclare la classe X, appliquer ses ressources avant la classe Y". En d'autres termes, je veux déclarer un ordre, mais rester silencieux sur l'application ou non de la classe X.
Si je comprends bien le métaparamètre "avant", dire :
class X {
...
before => Class['Y'],
}
class Y {
...
}
node N {
include Y
}
node M {
include X
include Y
}
inclura les ressources de X et de Y sur les nœuds M et N. Au lieu de cela, ce que je veux, c'est exprimer séparément, "Appliquez juste Y," ou "Appliquez X et Y, et appliquez X avant Y".
Pour le contexte, ce que je veux faire plus concrètement, c'est m'assurer que mes dépôts Yum sont configurés avant que Puppet n'applique les ressources des paquets. Je veux omettre certains dépôts sur certains nœuds. Je veux que mes définitions de ressources de paquets restent naïves par rapport aux dépôts correspondants ; je ne veux pas encombrer mes définitions de ressources de paquets avec des dépendances sur des dépôts spécifiques.
J'ai essayé d'utiliser les Run Stages, mais au-delà de la configuration la plus simple, ils semblent provoquer des cycles de dépendances. Par exemple, ceci pourrait fonctionner :
stage { 'first': before => Stage['main'] }
class X {
...
before => Class['Y'],
}
class Y {
...
}
node N {
include Y
}
node M {
class { "X": stage => first }
include Y
}
Mais ce ne serait pas le cas :
stage { 'first': before => Stage['main'] }
class X {
...
class { "Z": stage => first } # to avoid Z "floating off"
before => Class['Y'],
}
class Y {
...
include Z
}
class Z { ... }
node N {
include Y
}
node M {
class { "X": stage => first }
include Y
}
Dans ce dernier cas, Puppet pense qu'il y a un cycle de dépendance. Je présume que cela est dû au fait que Z est déclaré et que ses ressources sont gérées en deux étapes différentes. Je pourrais potentiellement simplifier les classes dont j'ai besoin dans l'étape "première" pour éviter les problèmes de cycle de dépendance que je vois en pratique, mais la documentation de Puppet étale FUD sur les étapes de la course.
Voici la partie spécifique de la configuration qui rend Run Stages vraiment peu attrayante pour moi. Dans les VM de développement, je démarre un serveur Yum localement via un "devrepo".
class yum::devrepo {
# Ensures httpd is running as a Yum server before anything else
# tries to install packages from it.
exec { 'httpd-for-yum':
command => '/sbin/service httpd restart',
require => Class['yum::server'],
}
yumrepo {
"devrepo":
require => [Exec['httpd-for-yum'],],
descr => "Local Dev YUM Repo",
baseurl => "http://localhost/repos/redhat/5/x86_64/",
gpgcheck => "0",
enabled => "1",
}
}
class yum::server {
include httpd
package { ['createrepo']:
ensure => present;
}
exec { 'update-repo-metadata':
require => [ Package['createrepo']],
cwd => '/var/www/html/yum',
command => '/usr/bin/createrepo --update -d repos/redhat/5/x86_64/',
creates => '/var/www/html/yum/repos/redhat/5/x86_64/repodata/repomd.xml',
}
file {'/etc/httpd/conf.d/yum.conf':
ensure => file,
mode => 0644,
source => "puppet:///modules/yum/yum_httpd.conf",
require => Package['httpd'],
notify => Service['httpd'],
}
}
Je veux inclure mon repo Yum de production sur certains nœuds et le repo dev sur d'autres.
Si je mets yum::server
y yum::devrepo
dans l'étape "première", puis plus tard les déclarations httpd dans d'autres classes causent des problèmes plus tard, parce que les autres classes mettent httpd dans l'étape principale.
Si Puppet peut exprimer "Si je déclare la classe X, appliquer ses ressources avant la classe Y", comment ? Sinon, comment puis-je obtenir l'ordre que je veux sans cycles de dépendance et sans inclure les ressources du référentiel Yum que je veux omettre ?