Jinja2 は強力で使いやすいPythonベースのテンプレートエンジンであり、構成が1回おきに変化する複数のサーバーがあるIT環境で役立ちます。これらのノードごとに静的構成ファイルを作成するのは面倒であり、より多くの時間とエネルギーを消費するため、実行可能なオプションではない場合があります。そして、これがテンプレートの出番です。
Jinja2テンプレートは、時々変更される可能性のある変数を格納する単純なテンプレートファイルです。 Playbookが実行されると、これらの変数はAnsiblePlaybooksで定義された実際の値に置き換えられます。このように、テンプレートは、構成ファイルを簡単に作成または変更するための効率的で柔軟なソリューションを提供します。
このガイドでは、AnsibleプレイブックでJinja2テンプレートを構成して使用する方法に焦点を当てます。
テンプレートアーキテクチャ
Jinja2テンプレートファイルは、実行時またはコードの実行時に評価され、実際の値に置き換えられる変数を含むテキストファイルです。 Jinja2テンプレートファイルには、次のタグがあります。
- {{}} :これらの二重中括弧は、テンプレートファイルで広く使用されているタグであり、変数を埋め込み、最終的にコード実行中にそれらの値を出力するために使用されます。たとえば、二重中括弧を使用した簡単な構文は次のとおりです。{{webserver}}は{{nginx-version}}で実行されています
- {%%} :これらは主に、ループやif-elseステートメントなどの制御ステートメントに使用されます。
- {##} :これらは、タスクを説明するコメントを示します。
ほとんどの場合、Jinja2テンプレートファイルは、サーバー上のファイルの作成または構成ファイルの置き換えに使用されます。それとは別に、ループなどの条件ステートメントを実行できます およびif-else ステートメント、およびフィルターなどを使用してデータを変換します。
テンプレートファイルには.j2が付いています 拡張、Jinja2テンプレートが使用されていることを意味します。
テンプレートファイルの作成
これは、Jinja2テンプレートファイルexample_template.j2の例です。これを使用して、表示されている変数を使用して新しいファイルを作成します
。Hey guys! Apache webserver {{ version_number }} is running on {{ server }} Enjoy!
ここで、変数は {{version_number}} &{{サーバー}
これらの変数はプレイブックで定義されており、以下のプレイブックYAMLファイルexample1.ymlの実際の値に置き換えられます。
プレイブックが実行されると、テンプレートファイル内の変数が実際の値に置き換えられ、新しいファイルが作成されるか、既存の file.txtが置き換えられます。 宛先パスにあります。
プレイブックの実行から、宛先を表示し、変数がAnsibleプレイブックファイルで定義された値に置き換えられていることを確認します。
構成ファイルをプッシュする方法をよりよく理解するために、 index.htmlを作成するJinja2テンプレートを作成します。 Webルートまたはドキュメントディレクトリ内のファイル/var / www / html CentOS7サーバー上。 Apacheはすでに実行されており、示されているようにデフォルトのウェルカムページを表示しています。
テンプレートファイルindex.html.j2が次のように表示されます。 ansible_hostnameの存在に注意してください 組み込み変数である変数。プレイブックが実行されると、これはWebサーバーのホスト名に置き換えられます。
<html> <center><h1> The Apache webserver is running on {{ ansible_hostname }} </h1> </center> </html>で実行されています
プレイブックファイルを以下に示します。
プレイブックが実行されると、新しいindex.htmlファイルが作成されます。ご覧のとおり、変数ansible_hostnameは、サーバーの実際のホスト名(この場合はCentos-7)に置き換えられています。
条件付きのJinja2テンプレート
Jinja2テンプレートは、アイテムのリストを反復処理するforループなどの条件ステートメントとともに使用することもできます。下の図に示すように、Playbookexample2.ymlについて考えてみます。「cars」と呼ばれる車種のリストを反復処理して結果をfile2.txt宛先ファイルに出力するテンプレートを作成します。
Jinja2テンプレートファイルのforループ– example2_template.j2 –表示されているとおりです
プレイブックが実行されると、ループは車のリストを繰り返し処理し、宛先ファイルに車のモデルを出力します。 catコマンドを使用して、出力を調べ、モデルがファイル内のどこに存在するかを確認できます。
フィルター付きのJinja2テンプレート
フィルタは、出力データまたはフォーマットデータの外観を変更するために使用されます。これは、次のように変数名をパイプすることで機能します:
{{変数|引数}}
いくつかのユースケースを確認しましょう:
a)文字列を大文字または小文字の形式に変換します
たとえば、テンプレートを使用して前のリストの値を大文字で出力するには、次のように変数itemを「UPPER」引数にパイプします。{{item |上部}}
プレイブックが実行されると、値は大文字に変換されます
値が最初から小文字の場合は、「lower」引数を使用します。
{{アイテム|下}}
b)リストフィルターを使用して、最大値と最小値を表示します
図のようにテンプレート内の配列またはリストを操作している場合は、特定の基準に基づいて希望の値を印刷することを選択できます。
たとえば、リストの最小値を出力するには、リスト全体を「 min」に渡します。 ’フィルターを図のように表示します。
{{[100、37、45、65、60、78] | min}} => 37
最大値を取得するには、「max」フィルターを使用します。
{{[100、37、45、65、60、78] |最大}}=>100
次のように、一意のフィルターを使用して、配列内の重複する値のリストから一意の値を取得できます。
{{[3、4、3、3、4、2、2] |ユニーク}}=>3,4,2
c)文字列値を別の値に置き換える
さらに、示されているように、replace引数を使用して文字列を新しい文字列に置き換えることができます
{{”こんにちはみんな” | replace(“ guys”、“ world”)}} => Hello world
上記の例では、string guysはworldに置き換えられ、ステートメントは次のようになります。
Hello world
これらはほんの数個のフィルターです。 AnsiblePlaybook実行の出力を操作するために使用できる組み込みフィルターがたくさんあります。
Jinja2テンプレートは、構成ファイル内の動的変数を処理する場合の理想的なソリューションです。これは、値を手動で変更するよりもはるかに効率的なオプションであり、多くの場合、多くの時間がかかり、非常に面倒な場合があります。この記事に関するフィードバックは大歓迎です。
また読む :文字列と行をAnsibleに置き換える方法
また読む : Ansibleロールを作成し、Playbookで使用する方法