Puppet - グローバル変数を使用して同じ名前のテンプレートを取得することは可能ですか?

Puppet - グローバル変数を使用して同じ名前のテンプレートを取得することは可能ですか?

私は 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 --testPuppet はファイルが見つからないと文句を言いますshell/bash/$service_env.erbが、私はファイルが存在することを再確認しました。notify ステートメントが期待される値を出力するため、var にアクセスできることはわかっているので、許可されていないことを実行しているのではないかと思います。

単一の変数をテンプレートに渡すことは可能だとわかっていますtemplate.erb。この場合は、custom.sh ファイルが小さく、環境間での変更があまりないため、これでうまくいきますが、より複雑な構成 (httpd、solr など) の場合は、環境固有のファイルにアクセスしたいと思います。環境固有のモジュール パスを指定できることもわかっていますが、複数の近い名前のディレクトリを持つのではなく、テンプレート レベルでこの動作を処理する方がよいでしょう。

ありがとう。

答え1

シングルクォーテーションを使用しています'shell/bash/$service_env.erb'変数は補間される二重引用符を使用する必要があります。

関連情報