La marionnette ne Peut pas Trouver de Variable pour le Modèle
Juste de commencer avec des Marionnettes, et j'ai de la difficulté avec mon premier modèle. Il devrait être très facile, mais je ne peux pas le comprendre.
J'ai un module "de base" à
/etc/puppet/modules/base/
./manifests
./manifests/service.pp
./manifests/init.pp
./manifests/params.pp
./manifests/config.pp
./manifests/install.pp
./templates
./templates/puppet.conf.erb
Il y a d'autres choses, mais il n'est pas nécessaire.
base/manifests/init.pp:
class base {
include base::install, base::service, base::config, base::params
}
base/manifests/config.pp
class base::config {
include base::params
File {
require => Class["base::install"],
ensure => present,
owner => root,
group => root,
}
file { "/etc/puppet/puppet.conf":
mode => 0644,
content => template("base/puppet.conf.erb"),
require => Class["base::install"],
nofity => Service["puppet"],
}
...
base/manifests/params.pp
class base::params {
$puppetserver = "pup01.sdirect.lab"
}
Enfin la partie la plus intéressante du modèle à la base/templates/puppet.conf.erb
...
server=<% puppetserver %>
Le message d'erreur:
erreur: Échec pour analyser le modèle de base/puppet.conf.erb: impossible de trouver
valeur pour "puppetserver' à
/etc/puppet/modules/base/manifests/config.pp:13 sur le nœud ...
Je ne comprends pas quel est le problème. J'ai copié cette partie tout droit sorti de la Pro de Marionnettes livre.
Quelqu'un pourrait-il me montrer où $puppetserver devraient être définis et comment?
OriginalL'auteur fandingo | 2012-05-14
Vous devez vous connecter pour publier un commentaire.
Le problème est que le nom de "puppetserver" doit être pleinement qualifiés afin de Marionnettes peut trouver de la valeur, puisqu'il est défini dans un domaine différent de celui du modèle est évaluée.
La variable est définie dans
base::params
ne peuvent donc être appelés simplement "puppetserver" dans ce champ. Lorsque vous cherchez à déterminer le modèle à partir de l'intérieur debase::config
, vous êtes dans un champ d'application différent et donc vous ne pouvez pas faire référence à la variable simplement par son nom abrégé. "Include", ajoute l'autre classe pour le catalogue, mais ne modifie pas ces règles.Cela signifie pour y accéder, vous de bien qualifier le nom de la classe:
base::params::puppetserver
. Si vous l'utilisiez dans le manifeste lui-même, ce serait$base::params::puppetserver
. Vous verrez des exemples similaires dans Pro de la Marionnette dans lessh::config
etssh::service
classes où il se réfère à "ssh_service_name" dans les paramètres de la classe (pages 43 à 45).D'accéder à la variable dans un modèle c'est un peu différent, utilisez
scope.lookupvar("base::params::puppetserver")
. Prendre votre exemple complet et l'ajout d'un manque signe égal (à la sortie de la valeur) dans le modèle:Il y a un peu plus d'informations à propos de la portée sur la La portée et de la Marionnette en tant que de 2,7 page.
(Edit: on dirait qu'il est répertorié sur le confirmé page d'errata trop avec la même solution.)
OriginalL'auteur Dominic Cleal
Réponse #1 est techniquement correcte, mais les résultats dans la très prolixe modèles.
Vous pouvez les raccourcir en apportant les valeurs d'une variable à partir d'autres classes dans votre propre classe portée:
Et ensuite les utiliser dans votre modèle comme prévu:
OriginalL'auteur qris
Vous pouvez également utiliser hérite de:
De cette façon, vous n'avez pas à définir
$puppetserver
de nouveau dans cette classe.OriginalL'auteur Carl P