Wie rufe ich eine Puppen-Filetemplate zweimal mit unterschiedlichen Parametern auf, ohne define zu verwenden?


7

Ich versuche, zwei verschiedene Dateien mit einer Vorlage zu erstellen, da sie sich nur um eine Zeile unterscheiden.

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 %>

Ich kann eine Variable nicht übergeben, indem $raid=yes file{} $raid=no file{}ich sie zweimal so definiere, also habe ich versucht, die Variable in jeder Variablen file{}ohne Aufwand zu definieren . dann habe ich darüber nachgedacht, den zieldateinamen in der vorlage zu verwenden, wie <% if filename == "/tmp/bootstrap-raid.sh" %>es auch nicht möglich ist.

Funktionsweise Rufen Sie eine Vorlage zweimal mit verschiedenen "Parametern" auf.

Mein Ziel ist es, keine zusätzliche Funktion in der Manifestdatei zu definieren und aufzurufen oder zwei Vorlagen zu erstellen. irgendwelche Ideen?

Gibt es vordefinierte Standardvariablen in einer Vorlage wie den Dateinamen der Zieldatei, den Vorlagennamen, ...?

edit: ein anderes Beispiel wären zwei php.ini-Dateien wie in debian, eine für die Kommandozeile und eine für den Webserver. Ich möchte nur das Speicherlimit austauschen. Jeder Server benötigt jedoch beide php.ini-Dateien. Ich suche nach einer Möglichkeit, einen fest codierten Parameter an die Vorlagendatei zu übergeben, oder nach einer Möglichkeit, die ich if/then/elsebasierend auf dem Zieldateinamen verwenden kann. Natürlich weiß ich, dass ich eine neue Definition erstellen kann, die ich zweimal aufrufen kann. aber ich suche einen einfacheren Weg.

Antworten:


1

Sie können den Ressourcennamen nicht erhalten (wie es scheint), aber Sie können die Klasse erhalten. Zum Beispiel:

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"),
    }
}

Und für die Vorlage:

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

Es gibt auch titleverfügbar, was normalerweise dasselbe bedeutet (zumindest habe ich nie gesehen, dass sie sich unterscheiden).


Vielen Dank für die Antwort, Ihre Lösung ist nicht, dass ich gesucht werde, aber Ihre Antwort ist richtig, ist einfach nicht möglich. Um es zum Laufen zu bringen, wechselte ich zu Definitionen.
c33s

7

Vielleicht sollten Sie dies mit einer Definition tun?

Klasse Bootstrap {
 definiere conf ($ israid = undef) {
  $ loc = $ name
  Datei {
    "$ loc":
      Inhalt => Vorlage (blah.erb);
  }}
 }}
}}       

dann nenne es mit

Bootstrap einschließen
  bootstrap :: conf {
    "/ loc":
      israid => '-r yes \';
    }}
  bootstrap :: conf {
    "/ otherloc":
      israid => '-r no \';
    }}

Ihre Vorlage muss mit der israidVariablen umgehen. Sie können einfach ein Include verwenden und die Logik aus der Vorlage heraushalten (oder zumindest weniger der darin enthaltenen Logik)

 <%= israid %>

Danke für die Antwort, aber es ist nicht das, wonach ich suche. Klarstellung hinzugefügt.
c33s

Warum möchten Sie keine Definition verwenden?
Tacticus

1
Ein (Pseudocode) erscheint template("templatename.erb",'myvar' => 12)mir praktischer, als für jede Vorlage, die ich zweimal verwenden möchte, eine Definition hinzufügen zu müssen. Ich denke, es muss eine einfache Möglichkeit geben, auf den Zieldateinamen zuzugreifen oder eine Variable einfach zu übergeben.
c33s
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.