時々、私のansibleロールで使用するjinja2テンプレートをテストする必要があります。これを行う最も簡単な方法は何ですか?
たとえば、テンプレート(test.j2)があります。
{% if users is defined and users %}
{% for user in users %}{{ user }}
{% endfor %}
{% endif %}
およびvars(group_vars/all内):
---
users:
- Mike
- Smith
- Klara
- Alex
現時点では、4つの異なるバリアントが存在します。
1_Online( https://cryptic-cliffs-32040.herokuapp.com/ を使用)
jinja2-live-parser コードに基づきます。
2_Interactive(pythonおよびライブラリjinja2、PyYamlを使用)
import yaml
from jinja2 import Template
>>> template = Template("""
... {% if users is defined and users %}
... {% for user in users %}{{ user }}
... {% endfor %}
... {% endif %}
... """)
>>> values = yaml.load("""
... ---
... users:
... - Mike
... - Smith
... - Klara
... - Alex
... """)
>>> print "{}".format(template.render(values))
Mike
Smith
Klara
Alex
3_Ansible(--checkを使用)
テストプレイブックjinja2test.ymlを作成します。
---
- hosts: 127.0.0.1
tasks:
- name: Test jinja2template
template: src=test.j2 dest=test.conf
そしてそれを実行します:
ansible-playbook jinja2test.yml --check --diff --connection=local
サンプル出力:
PLAY [127.0.0.1] **************************************************************
GATHERING FACTS ***************************************************************
ok: [127.0.0.1]
TASK: [Test jinja2template] ***************************************************
--- before: test.conf
+++ after: /Users/user/ansible/test.j2
@@ -0,0 +1,4 @@
+Mike
+Smith
+Klara
+Alex
changed: [127.0.0.1]
PLAY RECAP ********************************************************************
127.0.0.1 : ok=2 changed=1 unreachable=0 failed=0
4_Ansible(-mテンプレートを使用)@artburkartに感謝
Test.txt.j2というファイルを作成します
{% if users is defined and users %}
{% for user in users %}
{{ user }}
{% endfor %}
{% endif %}
次のようにansibleを呼び出します:
ansible all -i "localhost," -c local -m template -a "src=test.txt.j2 dest=./test.txt" --extra-vars='{"users": ["Mike", "Smith", "Klara", "Alex"]}'
現在のディレクトリにtest.txt
というファイルが出力されます。このファイルには、評価されたtest.txt.j2
テンプレートの出力が含まれます。
これはvarsファイルを直接使用しないことを理解していますが、外部の依存関係を使用せずにテンプレートをテストする最も簡単な方法だと思います。また、jinja2ライブラリが提供するものとansibleが提供するものとの間にいくつかの違いがあると思うので、ansibleを使用すると矛盾が直接回避されます。 --extra-vars
にフィードされるJSONがニーズを満たせば、それをYAMLに変換して作業を開始できます。
test.j2
というjinja2テンプレートとgroup_vars/all.yml
にあるvarsファイルがある場合、次のコマンドでテンプレートをテストできます。
ansible all -i localhost, -c local -m template -a "src=test.j2 dest=./test.txt" --extra-vars=@group_vars/all.yml
現在のディレクトリにtest.txt
というファイルが出力されます。このファイルには、評価されたtest.j2
テンプレートの出力が含まれます。
これは、外部の依存関係を使用せずにテンプレートをテストする最も簡単な方法だと思います。また、jinja2ライブラリが提供するものとansibleが提供するものとの間には違いがあるため、ansibleを使用すると矛盾が直接回避されます。 JSONを使用して、追加のvarsファイルを作成せずにアドホック変数をテストすることもできます。
ansible all -i "localhost," -c local -m template -a "src=test.j2 dest=./test.txt" --extra-vars='{"users": ["Mike", "Smith", "Klara", "Alex"]}'