2 votes

Accéder à une variable de nœud en classe et l'utiliser dans un conditionnel

J'essaie de configurer les hôtes virtuels Apache avec Puppet et j'ai essayé différentes choses sans grand succès.

J'ai défini un nœud comme suit :

node 'test1.cob' inherits serveurClient {
        $smcvhost = 'all'
}

La classe serveurClient inclut la classe apache. Cela fonctionne bien, Apache est installé et toute la configuration est appliquée correctement, sauf les hôtes virtuels.

La configuration relative aux hôtes virtuels est la suivante :

class apache::config {
    File{
        require => Class["apache::install"],
        notify  => Class["apache::service"],
        ensure  => present,
        owner   => "www-data",
        group   => "www-data",
        mode    => 755
    }
    ...
    if ( $smcvhost == 'belleville' ) or ( $smcvhost == 'all' ) {
        apache::smcvhost{'belleville':
            client => 'belleville',
        }
    }
    ...
}

Le site apache::smcvhost fonctionne correctement car si je la spécifie directement dans le nœud sans la condition, l'hôte virtuel est créé correctement et sans erreur. Si je supprime l'instruction if, il sera également créé correctement. J'ai essayé de ne spécifier que la deuxième condition mais cela n'a pas fonctionné.

Lorsque l'exécution échoue, je ne reçois pas d'erreur. Le rapport Puppet ignore simplement cette partie de la configuration.

Je pense qu'il s'agit d'un problème de délimitation de variable, mais d'après ce que j'ai lu, cette pratique semble correcte et j'imagine que Puppet me donnerait une erreur si j'essayais d'évaluer une variable inexistante.

2voto

Daniel C. Sobral Points 5453

Puppet ne vous avertit pas en cas de variables non définies (sauf sur les modèles, curieusement) et, lorsque vous définissez une variable, seuls les éléments spécifiés sont pris en compte. après il est affecté. Donc :

node 'test1.cob' inherits serveurClient {
        # Nothing above this line knows $smcvhost
        $smcvhost = 'all'
        # Stuff from this line until "}" knows $smcvhost
}
        # Stuff from this point on don't know $smcvhost

Si vous consultez les notes de mise à jour des versions récentes de Puppet, vous constaterez que la détermination dynamique de la portée est sur le point de prendre sa retraite. Mon conseil est d'éviter autant que possible d'utiliser des variables pour transmettre des informations -- utilisez des paramètres, comme dans les définitions ou les classes avec paramètres.

0voto

tsbertalan Points 467

Au lieu de :

Le noeud 'test1.cob' hérite de serveurClient { $smcvhost = 'all' (tous) }

si vous le faites :

node 'test1.cob' { $smcvhost = 'all' (tous) include serveurClient }

alors votre variable existera dans la portée de serveurClient, qui est l'endroit où je suppose que votre classe apache est référencée.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X