てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] Jinja2 テンプレートによる生成結果をansible.builtin.template ルックアッププラグインで表示する

この記事は Ansible Advent Calendar 2023 2日目の記事です。

はじめに

ある時、Jinja2 テンプレートを書いていて、試行錯誤しながら結果がどうなるか確認したい時がありました。

ansible.builtin.template モジュールで、ファイルを生成してから確認する形でも良かったのですが、そのときはそれよりも Playbook の実行ログの中で確認したい気持ちが強かったです。ansible.builtin.template モジュール戻り値には生成結果が入りません。方法をその場で考えようととしたのですが、その時は思い浮かびませんでした。

少しあとで ansible.builtin.template モジュールではなく、ansible.builtin.template lookup プラグインの結果を ansible.buitlin.debug モジュールで表示すればいいと気が付きました。

その方法を試したときのことをまとめます。

  • 環境
    • ansible-core 2.15.6

サンプル

Playbook は以下の通り。vars で定義した変数を、テンプレートファイル test.j2 内で利用します。

---
- hosts: localhost
  gather_facts: false
  connection: local

  vars:
    fishes:
      - kingyo
      - ugui
      - oikawa

  tasks:
    - name: Debug Jinja2 template
      ansible.builtin.debug:
        msg: "{{ lookup('ansible.builtin.template', 'test.j2') }}"

Jinja2 テンプレートは以下の通り。

{% for i in fishes %}
Hello {{ i }}.
{% endfor %}

実行結果

まず普通に実行した結果です。

% ansible-playbook -i inventory.ini template.yml

PLAY [localhost] **************************************************************************************************

TASK [Debug Jinja2 template] **************************************************************************************
ok: [localhost] => {
    "msg": "Hello kingyo.\nHello ugui.\nHello oikawa.\n"
}

PLAY RECAP ********************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

一応生成結果が表示されてますね。が改行が入ると見にくいです。

コールバックプラグインcommunitu.general.yaml に変更します。ここでは アドホックな指定で。

% ANSIBLE_STDOUT_CALLBACK=community.general.yaml ansible-playbook -i inventory.ini template.yml

PLAY [localhost] ***************************************************************************************************

TASK [Debug Jinja2 template] **************************************************************************************
ok: [localhost] => 
  msg: |-
    Hello kingyo.
    Hello ugui.
    Hello oikawa.

PLAY RECAP ********************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

改行されて見やすくなりました。

おわりに

今回は ansible.builtin.debug モジュールと組み合わせましたが、ルックアッププラグインは他のモジュールのオプションや、vars ディレクティブによる変数定義などにも組み込めるので、小回りが効きます。

Playbook 内に Jinaj2 構文を書くのを避けたい場合は、ansible.builtin.template ルックアッププラグインを組み合わせるのも良さそうです。

参考

表示のさせ方あれこれ

tekunabe.hatenablog.jp

tekunabe.hatenablog.jp