
私は Puppet を初めて使用します。そのため、マニフェストを合理的に設定する最善の方法を模索しています。DRY (don't repeat yourself) 原則に従って、共通のディレクティブを 1 つのテンプレートにロードし、次に環境に一致するファイルから環境固有のディレクティブをロードしようとしています。基本的には次のようになります。
# 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
}
}
しかし、実行するたびに、puppet agent --test
Puppet はファイルが見つからないと文句を言いますshell/bash/$service_env.erb
が、私はファイルが存在することを再確認しました。notify ステートメントが期待される値を出力するため、var にアクセスできることはわかっているので、許可されていないことを実行しているのではないかと思います。
単一の変数をテンプレートに渡すことは可能だとわかっていますtemplate.erb
。この場合は、custom.sh ファイルが小さく、環境間での変更があまりないため、これでうまくいきますが、より複雑な構成 (httpd、solr など) の場合は、環境固有のファイルにアクセスしたいと思います。環境固有のモジュール パスを指定できることもわかっていますが、複数の近い名前のディレクトリを持つのではなく、テンプレート レベルでこの動作を処理する方がよいでしょう。
ありがとう。
答え1
シングルクォーテーションを使用しています'shell/bash/$service_env.erb'
。変数は補間される二重引用符を使用する必要があります。