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
相关产品推荐
相关产品推荐

