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

Ansible使用uri模块向Teams webhook发JSON时反斜杠转义问题

问题根因

当前写法存在两层转义冲突:

  • 手动拼接JSON字符串的方式本身不可靠:多层嵌套的引号、转义符在Jinja2模板渲染、JSON序列化两个阶段会被重复解析,很容易破坏格式。
  • 调用replace过滤器时,Jinja2会先解析字符串内的转义规则,把lookup读取文件时自动生成的合法双反斜杠(Windows路径单反斜杠的JSON标准转义形式)解析为单反斜杠,又没有做补全,最终生成的JSON payload里反斜杠不符合转义规范,Teams webhook无法解析。

这也是为什么不调用replace时请求正常——此时读取到的内容直接进入JSON序列化流程,转义逻辑不会被中间步骤破坏。

修复方案

彻底放弃手动拼接JSON字符串的写法,直接给uri模块传结构化的YAML字典,让模块自动完成JSON序列化,从根源上规避手动转义的问题。

可直接复用的任务配置

如果需要保留原有的单引号、换行替换逻辑,按如下写法调整:

# 先单独预处理日志内容,最后统一补全反斜杠转义
- ansible.builtin.set_fact:
    processed_log: "{{ lookup('file', filepath) | replace(\"'\", \"'\") | replace('\n', '   \n') | replace('\\', '\\\\') }}"

- ansible.builtin.uri:
    url: "{{ webhook_url }}"
    method: POST
    body:
      title: "{{ title }}"
      text: "{{ processed_log }}"
    body_format: json

如果不需要对日志内容做额外替换,直接用最简写法即可,不需要任何手动转义处理:

- ansible.builtin.uri:
    url: "{{ webhook_url }}"
    method: POST
    body:
      title: "{{ title }}"
      text: "{{ lookup('file', filepath) }}"
    body_format: json

注意:lookup插件本身运行在Jinja2上下文内,参数里直接写变量名即可,不要给filepath额外套{{ }}模板标记,否则会出现变量解析异常。

内容的提问来源于stack exchange,提问作者Vin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:54:15