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

Ansible执行含双引号JSON的MySQL更新语句问题排查

Ansible插入MySQL JSON时保留双引号的解决方案

正确代码实现

使用Ansible的to_json过滤器自动生成符合规范的JSON字符串,无需手动转义:

- name: 更新client_id为'test'的记录
  shell: >
    mysql {{ mysql_credentials_file_cmdline_parameter }} -s -N -e 
    "UPDATE test_db.test SET app_home_url = '{{ id_dns }}',
    app_callback_urls = '{{ callback_urls | to_json }}',
    app_dns = '{{ id_dns }}' 
    WHERE client_id = 'test';"
  vars:
    callback_urls:
      notification_callback_urls:
        app_novuid_registration: "{{ id_dns }}/user_registration"
        forgot_password: "{{ id_dns }}/password_reset"
      user_attribute_callback_url: "{{ id_dns }}/user_updated"
      check_switch_callback_url: "{{ id_dns }}/email_switched"

问题原因分析

  • 手动转义的混乱:直接在Shell模块中编写JSON字符串时,Ansible的Jinja2模板解析、Shell的引号规则会相互干扰,导致转义符被多次解析,最终生成多余反斜杠或丢失双引号。
  • MySQL的JSON格式要求:MySQL的JSON类型强制要求键和字符串值必须用双引号包裹,单引号包裹的结构会被当作普通字符串处理,无法识别为合法JSON。

之前尝试的问题

  • 直接编写JSON字符串:未转义的双引号会被Shell解析为字符串边界,导致MySQL接收到的内容丢失双引号。
  • 手动转义双引号:Jinja2和Shell会对反斜杠进行二次转义,最终生成\\\"这类无效转义,引发SQL语法错误。
  • 单引号包裹键值:生成的JSON使用单引号,不符合MySQL的JSON格式规范,无法被正确识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:49:50