てくなべ (tekunabe)

ansible / network automation / 学習メモ / 思考メモ

[Ansible] to_json や to_nice_json フィルターで日本語が Unicode エスケープされないようにする

はじめに

Ansible には、いい感じのフォーマットの JSON に変換するためのansible.builtin.to_nice_json フィルターがあります。

tekunabe.hatenablog.jp

日本語(おそらく非ASCII)が含まれているとデフォルトでは以下のように Unicode エスケープされます。

{
    "name": "\u51fa\u753a\u67f3"
}

ファイル出力時に不都合だったりするでエスケープされない方法を調べたら、このフィルターに ensure_ascii オプションがあって、これを無効にすると良いことが分かりました。

簡単ですが、試した結果をまとめます。

なお ansible.builtin.to_json フィルターにも ensure_ascii オプションがありますが、この記事のサンプルでは ansible.builtin.to_nice_json を利用します。

  • 検証環境
    • ansible-core 2.19.2

おためし

以下の Playbook でためします。

---
- name: JSON Test
  hosts: localhost
  gather_facts: false
  connection: local

  tasks:
    - name: Test to_nice_json
      ansible.builtin.copy:
        content: "{{ station | ansible.builtin.to_nice_json(ensure_ascii=false) }}"
        dest: station.json
      vars:
        station:
          name: 出町柳

実行すると、出力先の station.json は、以下のように日本語が普通に読める形式になります。

{
    "name": "出町柳"
}

なお、

    content: "{{ station | to_nice_json }}"

と指定したときは、ensure_ascii がデフォルトの true なので、以下のようになります(「はじめに」に載せた通り)。

{
    "name": "\u51fa\u753a\u67f3"
}

おわりに

この方法がうまくいくには環境的な条件があるかもしれませんが、試す価値はあるかなと思います。