You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 20:55:36