Question Comment appeler un modèle de filet de marionnettes deux fois avec des paramètres différents sans utiliser define?


J'essaie de créer deux fichiers différents avec un seul modèle, car ils ne diffèrent que par une ligne.

file 
{
    "/tmp/bootstrap-raid.sh":
    content => template("pxe/bootstrap.sh.erb"),
}

file 
{
    "/tmp/bootstrap-noraid.sh":
    content => template("pxe/bootstrap.sh.erb"),
}

bootstrap.sh.erb:

<% if ??? == "???" %>
-r yes \
<% else %> 
-r no \
<% end %>

je ne peux pas passer une variable en le définissant deux fois comme $raid=yes file{} $raid=no file{}, donc j'ai essayé de définir la variable à l'intérieur de chaque file{} sans effort. alors j'ai pensé à utiliser le nom de fichier target à l'intérieur du modèle comme <% if filename == "/tmp/bootstrap-raid.sh" %> ce qui n'est également pas possible.

comment travailler appelle deux fois un modèle avec des "paramètres" différents

Mon objectif est de ne pas définir et d'appeler une fonction supplémentaire dans le fichier manifeste, ou de créer deux modèles. des idées?

Existe-t-il des variables prédéfinies par défaut dans un modèle, telles que le nom de fichier du fichier cible, le nom de modèle, ...?

modifier: un autre exemple serait d'avoir deux fichiers php.ini comme dans debian, un pour la ligne de commande et un pour le serveur web. Je veux seulement échanger la limite de mémoire. mais chaque serveur a besoin des deux fichiers php.ini. Je cherche un moyen de passer un paramètre codé en dur au fichier de modèle ou une manière que je peux if/then/else basé sur le nom du fichier cible. Bien sûr, je sais que je suis capable de créer une nouvelle définition, que je peux appeler deux fois. mais je cherche un moyen plus facile.


7
2017-10-18 03:19


origine




Réponses:


Vous ne pouvez pas obtenir le nom de la ressource (il semble), mais vous pouvez obtenir la classe. Par exemple:

class bootstrap-raid {
    file {
        "/tmp/bootstrap-raid.sh":
        content => template("/root/bootstrap.sh.erb"),
    }
}
class bootstrap-noraid {
    file {
        "/tmp/bootstrap-noraid.sh":
        content => template("/root/bootstrap.sh.erb"),
    }
}

Et pour le modèle:

<% if name == "bootstrap-raid" %>
-r yes \
<% else %> 
-r no \
<% end %>

Il y a aussi title disponible, ce qui signifie généralement la même chose (du moins, je ne les ai jamais vues différer).


1
2017-10-18 15:01



merci pour la réponse, votre solution n'est pas je suis recherché, mais votre réponse est correcte, c'est tout simplement pas possible. pour le faire fonctionner, je suis passé à définit. - c33s


Peut-être devriez-vous le faire avec une définition?

classe bootstrap {
 define conf ($ israid = undef) {
  $ loc = $ name
  fichier {
    "$ loc":
      content => template (blah.erb);
  }
 }
}

puis appelez-le avec

inclure bootstrap
  bootstrap :: conf {
    "/ loc":
      israid => '-r yes \';
    }
  bootstrap :: conf {
    "/ otherloc":
      israid => '-r no \';
    }

votre modèle devra gérer le israid variable, vous pouvez simplement utiliser une inclusion et garder la logique en dehors du modèle (ou du moins moins de la logique

 <%= israid %>

7
2017-10-18 03:37



merci d'avoir répondu, mais ce n'est pas ce que je recherche. ajouté à la désagrégation. - c33s
Pourquoi ne voulez-vous pas utiliser une définition? - Tacticus
un (pseudocode) template("templatename.erb",'myvar' => 12) Cela me semble plus pratique que de devoir ajouter une définition pour chaque modèle que je veux utiliser deux fois. Je pense qu’il doit exister un moyen simple d’accéder au nom de fichier cible ou de transmettre facilement une variable. - c33s