Ansible:使用shell模块的任务中单引号转义问题
Ansible Shell模块中SQL语句带单引号的变量插值问题解决
问题根源
你原来的Playbook里,试图用''' + ctfile1_vars.ct_machine_serial | upper + '''这种写法给变量包裹单引号,但这不符合Jinja2的模板语法规则,导致变量没法被正确插值,最终生成的SQL语句缺少必要的单引号,触发语法错误。
可行解决办法
下面几种方式都能生成和手动执行完全一致的SQL命令:
方式1:直接在Jinja2插值时添加单引号
这是最直观的写法,直接给字符串变量套上单引号,避免复杂的拼接:
- name: Insert scanner ct/ecc serial values into the sql database on both dispatchers. shell: >- mysql databasename -e "insert into Scanner values ({{ ctfile1_vars.ct_machine_serial_number }}, {{ ctfile1_vars.ct_machine_serial_number }}, '{{ ctfile1_vars.ct_machine_serial | upper }}')" become: yes register: result
方式2:用Jinja2的format过滤器统一处理
把SQL语句做成模板,用format过滤器传入变量,转义内部单引号避免冲突:
- name: Insert scanner ct/ecc serial values into the sql database on both dispatchers. shell: >- mysql databasename -e "{{ 'insert into Scanner values ({0}, {0}, \'{1}\')' | format(ctfile1_vars.ct_machine_serial_number, ctfile1_vars.ct_machine_serial | upper) }}" become: yes register: result
方式3:提前定义SQL语句变量
如果后续SQL逻辑有变化,这种分离写法更易维护:
- name: 定义SQL插入语句 set_fact: sql_insert_content: "insert into Scanner values ({{ ctfile1_vars.ct_machine_serial_number }}, {{ ctfile1_vars.ct_machine_serial_number }}, '{{ ctfile1_vars.ct_machine_serial | upper }}')" - name: Insert scanner ct/ecc serial values into the sql database on both dispatchers. shell: mysql databasename -e "{{ sql_insert_content }}" become: yes register: result
验证方法
执行Playbook时加上-vvv参数,查看输出的实际shell命令,确认生成的内容和手动执行的一致:
mysql databasename -e "insert into Scanner values (63,63,'M63')"
内容的提问来源于stack exchange,提问作者Viscosity
相关产品推荐
相关产品推荐

