AnsibleのJinja2「template error while templating string」エラーの修正方法

beginner🔧 Ansible2026-04-21| Ansible 2.9+、Python 3.x、Linux/macOS

Error Message

AnsibleError: template error while templating string: expected token ':', got '}'. String: {{ myvar }
#ansible#jinja2#テンプレート#変数#構文

TL;DR: 素早い解決策

このエラーはほぼ必ず、Jinja2式の構文ミスによって引き起こされます。最もよくある原因は、閉じ波括弧 } の欠落、または不完全なインライン if/else 文です。

エラーで示された行を確認し、変数が次のような形式になっているかチェックしましょう:

# 誤り
msg: "{{ myvar }"

# 正しい
msg: "{{ myvar }}"

インライン条件式を使用している場合は、ifelse の両方があることを確認してください:

# 誤り(elseが欠落)
msg: "{{ 'active' if enabled }}"

# 正しい
msg: "{{ 'active' if enabled else 'inactive' }}"

根本原因

Ansibleは {{ ... }} 内のすべてを評価するためにJinja2テンプレートエンジンを使用しています。expected token ':', got '}' というメッセージが表示される場合、Jinja2パーサーが変数または式の後に特定の文字を期待していたにもかかわらず、閉じ波括弧(または文字列の末尾)に到達してしまったことを意味します。

パーサーはコンテキストによって「混乱」します。たとえば、ディクショナリのマッピングや三項演算子の操作を開始しようとしていると判断した場合、コロン : を探します。期待される }} の代わりに単一の } を指定すると、式が構文的に不完全なためパーサーは失敗します。

よくあるケースと修正方法

1. 波括弧の欠落(タイポ)

これが最も頻繁な原因です。変数を {{ で始めたにもかかわらず、単一の } しか閉じていないケースです。

# 失敗例:expected token ':', got '}'
- name: 変数を出力
  ansible.builtin.debug:
    msg: "値は {{ web_server_port }"

**修正方法:**常に二重波括弧がペアになっていることを確認しましょう。

- name: 変数を出力
  ansible.builtin.debug:
    msg: "値は {{ web_server_port }}"

2. 不完全なインライン三項演算子

Jinja2は 条件がtrueの値 if 条件 else 条件がfalseの値 の形式をサポートしています。他の言語と異なり、{{ ... }} 内で使用する場合、Jinja2式では else 部分が必須です。

# 失敗例
- name: ステータスを設定
  ansible.builtin.set_fact:
    app_status: "{{ 'running' if service_up }}"

修正方法:else 節を追加します。

- name: ステータスを設定
  ansible.builtin.set_fact:
    app_status: "{{ 'running' if service_up else 'stopped' }}"

3. YAMLでの不適切なクォート

YAMLパーサーとJinja2パーサーが衝突することがあります。文字列が {{ で始まる場合、YAMLでは行全体をクォートで囲む必要があります。クォートが欠落していたり、誤った使い方をしていると、エンジンに渡されるJinja2文字列が切り捨てられたり、壊れたりする可能性があります。

# 問題が発生する可能性がある書き方
- name: 不正なクォート
  shell: echo {{ my_var }

**修正方法:**Jinja2式が値の先頭にある場合は、必ずクォートで囲みましょう。

- name: 正しいクォート
  shell: "echo {{ my_var }}"

4. 式内でのディクショナリ構文

ディクショナリのキーにアクセスしたり、その場でディクショナリを定義しようとしている場合、コロンまたはクォートが欠落するとこのエラーが発生します。

# dictのコロンを忘れた場合の失敗例
- name: バグのあるdict参照
  ansible.builtin.set_fact:
    config: "{{ {'port' 8080} }}"  # 'port'の後にコロンが欠落

確認手順

修正を確認するには、構文チェックフラグを付けてPlaybookを実行します。デプロイ全体を実行するよりも時間がかかりません。

ansible-playbook my_playbook.yml --syntax-check

構文チェックが通ったら、debug モジュールを使って式が正しくレンダリングされることを確認します:

- name: 修正のデバッグ
  ansible.builtin.debug:
    msg: "変数の値: {{ myvar }}"

予防のためのプロヒント

  • **IDE拡張機能を使用する:**VS Codeの「Ansible」または「Jinja2」拡張機能を使うと、不一致の波括弧が赤くハイライトされます。
  • スペースは可読性のために重要:{{variable}} ではなく {{ variable }} と書きましょう。末尾の波括弧の欠落をはるかに見つけやすくなります。
  • リンターを使う:ansible-lint を実行しましょう。コードを実行する前に、このような低レベルの構文エラーを検出してくれることが多いです。

Related Error Notes