web-dev-qa-db-ja.com

Ansibleでjinja2テンプレートをテストするにはどうすればよいですか?

時々、私の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
44
Alex

現時点では、4つの異なるバリアントが存在します。

1_Onlinehttps://cryptic-cliffs-32040.herokuapp.com/ を使用)
jinja2-live-parser コードに基づきます。

Example

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に変換して作業を開始できます。

74
Alex

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"]}'
29
artburkart