Jinja2は、最も強力で有名なPythonベースのテンプレートエンジンの1つです。同じプログラミング言語であるため、Ansibleユーザーに最も人気があります。多くのIT担当者をさまざまな方法で支援します。 Jinja2テンプレートは、ansibleの変数にアクセスできます。 Ansibleでは、多くの時間を消費するサーバーごとに多くのことを変更する必要があります。したがって、jinja2テンプレートを使用すると、変数をそのテンプレートにのみ変更できるため、多くの時間と簡単な環境を節約できます。
ansibleでは、変数にアクセスするためにjinja2テンプレートが使用されます。したがって、一度に必要に応じて変数を変更すると、ansibleプレイブックで多くの時間を節約できます。 Jinja2テンプレートにはフィルターが組み込まれており、ユーザーはこのようなフィルターを操作できるのは、スムーズなプレイブック用に多くのファイルを構成する場合のみです。
他にも多くの機能があります。それらのいくつかを以下に示します。
- デバッグ目的では非常に簡単です
- テンプレートの継承は十分にサポートされています
- 非常に高速で簡単にコンパイルできます
この記事では、jinja2テンプレートの使用法とそれを構成するプロセスについて説明します。
Jinja2テンプレートによってアクセスされる変数
Jinja2テンプレートは、ansibleの変数にアクセスできます。 Ansibleコントロールノードで、同じディレクトリまたはプレイブックで定義されている変数に簡単にアクセスできるjinja2テンプレートファイルを記述します。
変数にアクセスして値にアクセスし、操作するjinja2テンプレートを示す例を作成します。ここで、プレイブックはjinja2_var_example.yml
です。
それでは、プレイブックjinja2_var_example.yml
を実行してみましょう。
ここで、出力で値が変更されていることがわかります。 {{}}もjinja2テンプレートの構文であるため、変数にアクセスして値を実際の値に変更できます。
変数にアクセスするjinja2テンプレートを示す別の例。ここでは、フォルダを作成してから、jinja2テンプレート「nginx.conf.j2」を記述します。j2はjinja2テンプレートの拡張機能です。
$ mkdir jinja2_variable
$ cd jinja2_variable/
$ vim nginx.conf.j2
次に、変数が使用されている場所をテンプレート化したjinja2を使用してファイルを作成します。このような変数は、さまざまなファイルまたはプレイブックで定義でき、その時点で必要に応じて操作できます。
上のスクリーンショットの変数{{http_port}}と{{http_host}}に気付いたはずです。
次に、jinja2テンプレートファイルに含まれている変数の実際の値で構成されるプレイブックを作成します。
プレイブックが正常に実行されると、変数は宛先パスのファイル内の実際の値に置き換えられます。
下のスクリーンショットで値が変更されていることがわかります。
これらは、jinja2テンプレートが変数にアクセスし、最終出力に実際の値を表示していることを示す例です。
jinja2テンプレートの条件付き
forループのような条件文は、jinja2テンプレートで使用できます。ループは、範囲やリストなどのアイテムを反復処理するのに役立ちます。ここでは、jinja2テンプレートで使用されるforループを示す例を作成しています。
たとえば、テンプレートファイル「server_hosts.j2」を次のスクリーンショットのように記述します。
$ cat server_hosts.j2
出力:
{% for host in groups['all'] %} {{ hostvars[host].ansible_facts.default_ipv4.address }} {{ hostvars[host].ansible_facts.fqdn }} {{ hostvars[host].ansible_facts.hostname }} {% endfor %}
インベントリ内のすべてのホストを反復処理します。ホストごとに、テンプレートで使用されているすべての変数の値が表示されます。
コントロールノードでは、上記のjinja2テンプレートファイルを含むプレイブック「conditional.yml」を作成します。
$ sudo vim conditional.yml
現在、プレイブック「conditional.yml」を実行しています
$ ansible-playbook conditional.yml
これで、/ etc/hostsファイルが更新されているかどうかをホストノードで確認できます。
これは、インベントリ内のすべてのホストで繰り返されるjinja2テンプレートファイルの変数の最終結果です。したがって、forループのような条件文はjinja2テンプレートファイルでも使用できます。
jinja2テンプレートで使用されるフィルター
出力を異なるものにしたり、フォーマットしたりする場合は、フィルターを使用できます。以下に示すように、引数を使用して変数をパイプ処理できます。
{{ variable | argument }}
ここでは、jinja2テンプレートファイル「jinja_filters.j2」を作成して、jinja2テンプレートファイルで使用されているフィルターを表示します。
$ vim jinja_filters.j2
jinja2テンプレートファイルで構成されるプレイブック「filters.yml」を作成します。
$ vim filters.yml
現在、プレイブック「filters.yml」を実行しています
これで、宛先ファイルが大文字のコンテンツで作成されているかどうかに関係なく、ホストノードで結果を確認できます。
ここでは、変数項目を大文字の引数にパイプすることでフィルターを使用したため、すべてのテキストが大文字であることがわかります。
結論
要件に応じてこのようなjinja2テンプレートファイルを使用して、変数とデータを操作し、時間を節約し、ansibleでプレイブックをスムーズに実行できます。フィルタを使用して、数値を高いものから低いものへと操作することもできます。その他の機能については、jinja2テンプレートを調べてみてください。ありがとうございます!