如何在Ansible Template中正确转义TypeScript内容生成合法JSON?
用Ansible生成包含TypeScript代码的合法JSON文件
问题场景
需要通过Ansible的Template模块构建JSON文件,其中某个键的值为TypeScript代码。当前项目结构如下:
- myRole +- files | `- hello-world.ts +- templates | +- fragments | | `- hw-tag.fragment | `- payload.json.j2 +- tasks | `- main.yml `- vars `- main.yml
相关文件内容
- hello-world.ts:
let message: string = "Hello World"; console.log(message);
- payload.json.j2(原模板):
{ "id": "{{ id }}" "script": { {% with script=script %} {% include "fragments/hw-tag.fragment" %} {% endwith %} } }
- hw-tag.fragment(原片段):
"name": "{{ script.name }}" "script": "{{ script.content }}"
原实现及问题
最初通过lookup('file')读取TS文件内容,手动替换换行符后传入模板:
- set_fact: script: "{{ script|default({}) | combine({name: lookup('file', ...) | replace('\n', '\\n')}) }}" - debug: msg: "{{ script }}" - template: src: templates/payload.json.j2 dest: "{{ workdir }}/payload.json" vars: script: "{{ script }}"
生成的JSON存在格式错误:双引号未转义、换行符未正确处理,导致JSON不合法:
{ "id": "1", "script": { "name": "Hello World", "script": "let message: string = "Hello World"; console.log(message);" } }
期望得到的合法JSON:
{ "id": "1", "script": { "name": "Hello World", "script": "let message: string = \"Hello World\";\\nconsole.log(message);" } }
解决方案
方法1:利用to_json过滤器自动处理转义
Ansible的to_json过滤器会自动处理JSON所需的所有转义规则(包括双引号、换行符等),无需手动替换。
步骤1:修正变量赋值
去掉手动的换行符替换,直接读取文件内容:
- set_fact: script: name: "Hello World" content: "{{ lookup('file', 'files/hello-world.ts') }}"
步骤2:修改模板文件
在模板中对script.content使用to_json过滤器,注意不要手动加引号(过滤器会自动添加):
{ "id": "{{ id }}", "script": { "name": "{{ script.name }}", "script": {{ script.content | to_json }} } }
同时修复原模板中的语法错误:所有键值对末尾添加逗号(除了最后一个),避免JSON结构错误。
方法2:直接构建JSON结构并序列化(更推荐复杂场景)
完全跳过模板拼接,直接在Ansible中构建完整的JSON数据结构,再用to_nice_json序列化输出,避免模板语法错误:
- set_fact: payload_data: id: "{{ id }}" script: name: "Hello World" script: "{{ lookup('file', 'files/hello-world.ts') }}" - copy: content: "{{ payload_data | to_nice_json(indent=2) }}" dest: "{{ workdir }}/payload.json"
这种方式无需维护模板文件,所有转义由Ansible自动处理,复杂场景下更可靠。
原理说明
手动处理转义容易遗漏JSON规范要求的转义字符(比如双引号、反斜杠、换行符等),而Ansible的JSON过滤器会严格遵循RFC 8259标准处理转义,确保生成的JSON完全合法。
内容的提问来源于stack exchange,提问作者user4932655
相关产品推荐
相关产品推荐

