
Ich bin neu bei Puppet. Daher versuche ich herauszufinden, wie ich meine Manifeste am besten sinnvoll einrichten kann. Nach dem DRY-Prinzip (Don't Repeat Yourself) versuche ich, allgemeine Anweisungen in eine Vorlage zu laden und dann umgebungsspezifische Anweisungen aus einer Datei zu laden, die der Umgebung entspricht. Im Grunde so:
# nodes.pp
node base_dev {
$service_env = 'dev'
}
node 'service1.ownij.lan' inherits base_dev {
include global_env_specific
}
class global_env_specific {
include shell::bash
}
# modules/shell/bash.pp
class shell::bash inherits shell {
notify{"Service env: ${service_env}": }
file { '/etc/profile.d/custom_test.sh':
content => template('_global/prefix.erb', 'shell/bash/global.erb', 'shell/bash/$service_env.erb'),
mode => 644
}
}
Aber jedes Mal, wenn ich es ausführe, puppet agent --test
beschwert sich Puppet, dass es die Datei nicht finden kann shell/bash/$service_env.erb
, obwohl ich doppelt überprüft habe, ob sie existiert. Ich weiß, dass die Variable zugänglich ist, da die Benachrichtigungsanweisung den erwarteten Wert ausgibt, also vermute ich, dass ich etwas mache, was nicht erlaubt ist.
Ich weiß, dass ich eine einzelne Datei haben template.erb
und Variablen an die Vorlage übergeben könnte, was in diesem Fall funktionieren würde, da die Datei custom.sh klein ist und sich nicht viele Änderungen zwischen den Umgebungen ergeben, aber für komplexere Konfigurationen (httpd, solr usw.) würde ich lieber auf umgebungsspezifische Dateien zugreifen. Ich bin mir auch bewusst, dass ich umgebungsspezifische Modulpfade angeben kann, aber ich würde dieses Verhalten lieber einfach auf Vorlagenebene handhaben, anstatt mehrere ähnlich benannte Verzeichnisse zu haben.
Danke.
Antwort1
Sie verwenden einfache Anführungszeichen für, 'shell/bash/$service_env.erb'
was bedeutet, dass keineVariablen werden interpoliert. Sie müssen doppelte Anführungszeichen verwenden.