メインコンテンツにスキップ

templatefile 関数

templatefile は、指定されたパスにあるファイルを読み込み、指定されたテンプレート変数のセットを使用して、その内容をテンプレートとしてレンダリングします。

コードブロック
templatefile(path, vars)

テンプレート構文は、${ ... } で区切られた補間シーケンスを含む、OpenTofu言語本体の文字列テンプレートと同じです。この関数は、可読性のために、より長いテンプレートシーケンスを別のファイルに分割することを可能にします。

"vars" 引数はオブジェクトでなければなりません。テンプレートファイル内では、マップ内の各キーは補間のための変数として使用できます。テンプレートは、OpenTofu言語で利用可能な他の関数も使用できます。変数名は、それぞれ文字で始まり、その後に0個以上の文字、数字、またはアンダースコアが続きます。

OpenTofu言語の文字列はUnicode文字のシーケンスであるため、この関数はファイルの内容をUTF-8エンコードされたテキストとして解釈し、結果のUnicode文字を返します。ファイルに無効なUTF-8シーケンスが含まれている場合、この関数はエラーを生成します。

この関数は、OpenTofuの実行開始時に既にディスク上に存在するファイルにのみ使用できます。関数は依存関係グラフに関与しないため、この関数はOpenTofu操作中に動的に生成されるファイルには使用できません。

*.tftpl は、テンプレートファイルに使用する推奨される命名パターンです。OpenTofuは他の名前の使用を妨げませんが、この規則に従うことで、エディターが内容を理解しやすくなり、結果としてより良い編集エクスペリエンスを提供できる可能性があります。

再帰

templatefileで再帰を使用する場合、注意すべき制限事項がいくつかあります。

templatefile への再帰呼び出しは、呼び出し深度が制限されます(デフォルトでは1024)。これは、意図しない無限再帰呼び出しによるクラッシュを防ぎ、メモリ不足によるクラッシュの可能性を制限するためです。

末尾再帰はサポートされていないため、スタックを巻き戻す前に、呼び出しスタック内のすべてのドキュメントをメモリにロードする必要があります。最新のシステムと構成では、これは問題にならない可能性が高いですが、注意が必要です。

実行中に最大再帰深度に達した場合、問題の診断に役立つように、呼び出しスタックの最初の数ステップを説明する簡潔なエラーが提供されます。完全な呼び出しスタックが必要な場合は、TF_LOG=debug を設定すると、完全なtemplatefile呼び出しスタックがコンソールに出力されます。

構成でより大きな最大再帰深度が必要な場合は、TF_TEMPLATE_RECURSION_DEPTH 環境変数を使用してデフォルトをオーバーライドできます。これは推奨されず、緊急回避策としてのみ提供されます。さらに、1024のデフォルトよりも低い値に設定すると、templatefile関数を使用するモジュールで問題が発生する可能性があります。

リスト

次の内容のテンプレートファイル backends.tftpl があるとします。

コードブロック
%{ for addr in ip_addrs ~}
backend ${addr}:${port}
%{ endfor ~}

templatefile 関数は、テンプレートを次のようにレンダリングします。

コードブロック
> templatefile("${path.module}/backends.tftpl", { port = 8080, ip_addrs = ["10.0.0.1", "10.0.0.2"] })
backend 10.0.0.1:8080
backend 10.0.0.2:8080

マップ

以下の内容を持つテンプレートファイル config.tftpl が与えられた場合

コードブロック
%{ for config_key, config_value in config }
set ${config_key} = ${config_value}
%{ endfor ~}

templatefile 関数は、テンプレートを次のようにレンダリングします。

コードブロック
> templatefile(
"${path.module}/config.tftpl",
{
config = {
"x" = "y"
"foo" = "bar"
"key" = "value"
}
}
)
set foo = bar
set key = value
set x = y

テンプレートからJSONまたはYAMLを生成する

生成したい文字列がJSONまたはYAML構文である場合、多数の個別の補間シーケンスとディレクティブを使用すると、正しく解釈される有効なJSONまたはYAMLを生成するテンプレートを作成するのが難しく、面倒になることがよくあります。

代わりに、jsonencode または yamlencode のいずれかへの単一の補間呼び出しのみで構成されるテンプレートを作成し、以下の例のように、通常のOpenTofu式構文を使用してエンコードする値を指定できます。

コードブロック
${jsonencode({
"backends": [for addr in ip_addrs : "${addr}:${port}"],
})}
コードブロック
${yamlencode({
"backends": [for addr in ip_addrs : "${addr}:${port}"],
})}

前のセクションの backends.tftpl の例と同じ入力が与えられた場合、これは、エスケープやデリミタを手動で処理する必要なく、指定されたデータ構造の有効なJSONまたはYAML表現を生成します。上記の最新の例では、ip_addrs の要素に基づく繰り返しは、テンプレートディレクティブを使用するのではなく、forを使用することで実現されています。

コードブロック
{"backends":["10.0.0.1:8080","10.0.0.2:8080"]}

結果のテンプレートが小さい場合は、代わりにメイン構成ファイルに jsonencode または yamlencode 呼び出しをインラインで記述することを選択し、個別のテンプレートファイルを作成することを完全に回避できます。

コードブロック
locals {
backend_config_json = jsonencode({
"backends": [for addr in ip_addrs : "${addr}:${port}"],
})
}

詳細については、jsonencode および yamlencode の主要ドキュメントを参照してください。

  • file は、ディスクからファイルを読み取り、テンプレートの解釈なしでリテラルコンテンツを返します。
  • templatestring は、文字列を受け取り、指定されたテンプレート変数のセットを使用してテンプレートとしてレンダリングします。