こちらの記事は Ansible lint Advent Calendar 2022 カレンダー2 9日目の記事になります。
今回はルール jinja について説明します。
jinja
jinja は Ansible コンテンツで jinja2 テンプレートが利用されている時にテンプレートの記述に違反がないか検証します。
現在のところ次のような項目が検証されます。
jinja[spacing]
{{var_name|filter}}
のように変数と演算子(フィルタを含む)の間に空白がない場合、エラーが出力されます。Ansible では{{ var_name | filter }}
のように記述します。
jinja[invalid]
"{{ & }}"
のようにテンプレートの記述が妥当でない場合、エラーが出力されます。Ansible では"{{ '&' }}"
のように記述します。
問題のあるコード
---
- name: Example playbook
gather_facts: false
hosts: all
vars:
bar: "{{ & }}" # <- 記号がエスケープされていない
dict: "{name:Ansible, github:https://github.com/ansible/ansible}" # <- key と value の間にスペースがない
foo: "{{ dict|dict2items(key_name='name', value_name='github') }}" # <- 演算子との間にスペースがない
tasks:
- name: Debug 1
ansible.builtin.debug:
var: bar
- name: Debug 2
ansible.builtin.debug:
var: foo
修正されたコード
---
- name: Example playbook
gather_facts: false
hosts: all
vars:
bar: "{{ '&' }}" # <- 記号はエスケーブする
dict: "{ name: Ansible, github: https://github.com/ansible/ansible }" # <- key と value の間にスペースを入れる
foo: "{{ dict | dict2items(key_name='name', value_name='github') }}" # <- 演算子にスペースを入れる
tasks:
- name: Debug 1
ansible.builtin.debug:
var: bar
- name: Debug 2
ansible.builtin.debug:
var: foo
その他
現在のところ jinja には次のような制限があります。
- 改行がある Jinja2 ブロックは検証されない。
- チルダを二項演算子として使用する Jinja2 ブロックは検証されない。
例 {{a ~ b }}
- 数字にドット記法を使用する Jinja2 ブロックは検証されない。
例 {{ foo.0.bar }}
jinja により Ansible コンテンツでのテンプレートの記述の不具合をすべて検出できるわけではありません。しかし最終的には Ansible 実行時にエラーになり処理が停止されるためテンプレートの記述の不具合がコンテンツに存在しても問題にならないかとは思われます。