我在剧本中有一个利用shell模块的任务。 此任务还恰好包含一个 sql 命令,该命令需要在其语法中使用单引号,这也恰好位于附加字符串的变量中。 我已经尝试了许多迭代方法来转义这些单引号,但无济于事,包括背离、双单引号、转义/引号过滤器,甚至标量折叠,似乎都没有工作。
如果您在外壳中键入命令时的外观。 (这确实有效)
sudo mysql databasename -e "insert into Scanner values (63,63,'M63')"
任务中的代码是什么样子的,导致问题,由于单引号问题,没有发生ct_machine_serial变量的正确插值:(这就是问题所在。
- 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 | string +','+ ctfile1_vars.ct_machine_serial_number | string +','+''' + ctfile1_vars.ct_machine_serial | upper +''' }})"
become: yes
become_method: sudo
register: result
此外,ctfile1_vars从 yaml 文件include_vars
导入数据派生的。 文件内容很简单,如下所示:
ct_machine_serial: m63
ct_machine_serial_number: 63
所以基本上 shell 任务应该被制定为它输出与我在第一个示例中的 shell 命令完全相同。 但是,我所期望的并没有发生。
现在我已经定义了基础知识,下面是完全包含的实际剧本代码。
tasks:
- name: Full import of the active scanner variables storage file for next sql modificaton.
include_vars:
file: ~/active_ct-scanner-vars.yml
name: ctfile1_vars
- 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 | string +','+ ctfile1_vars.ct_machine_serial_number | string +','+''' + ctfile1_vars.ct_machine_serial | upper +''' }})"
become: yes
become_method: sudo
register: result
最后,这是使用超级详细-vvv
运行的运行结果,它确实很好地显示了错误:
fatal: [server-1]: FAILED! => {
"changed": true,
"cmd": "mysql databasename -e "insert into Scanner values (63,63, + ctfile1_vars.ct_machine_serial | upper +)"",
"delta": "0:00:00.011330",
"end": "2022-10-17 17:13:46.813905",
"invocation": {
"module_args": {
"_raw_params": "mysql databasename -e "insert into Scanner values (63,63, + ctfile1_vars.ct_machine_serial | upper +)"",
"_uses_shell": true,
"argv": null,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"stdin_add_newline": true,
"strip_empty_ends": true,
"warn": true
}
},
"msg": "non-zero return code",
"rc": 1,
"start": "2022-10-17 17:13:46.864367",
"stderr": "ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1",
"stderr_lines": [
"ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1"
],
"stdout": "",
"stdout_lines": []
}
如输出所示,单引号(我假设)正在搞砸ctfile1_vars.ct_machine_serial | upper
变量和滤波器的正确插值/处理。 这显然会阻止插入正确的值,并且由于缺少单引号而搞砸了 mysql 语法。 显然,它应该简单地是:'M63'
就像在工作命令外壳示例中一样。
我已经尝试了数百次修复迭代,所以我希望这里有人可以告诉我我做错了什么。 提前感谢!
以下内容应该可以解决您的问题:
- name: Insert scanner ct/ecc serial values into the sql database on both dispatchers.
vars:
sernum: "{{ ctfile1_vars.ct_machine_serial_number }}"
ser: "{{ ctfile1_vars.ct_machine_serial }}"
shell: >-
mysql databasename -e "insert into Scanner values
({{ sernum | int }}, {{ sernum | int }}, '{{ ser | upper }}')"
同时,正如评论中所建议的,您可以遵循 ansible 的良好实践(即当模块存在时不要使用 shell),同时删除一个引用级别:
- name: Insert scanner ct/ecc serial values into the sql database on both dispatchers.
vars:
sernum: "{{ ctfile1_vars.ct_machine_serial_number }}"
ser: "{{ ctfile1_vars.ct_machine_serial }}"
mysql_query:
login_user: "{{ vault_encrypted_login }}"
login_password: "{{ vault_encrypted_password }}"
login_db: databasename
query: >-
insert into Scanner values
({{ sernum | int }}, {{ sernum | int }}, '{{ ser | upper }}')