jinja2 "set" 语句中的文字简单引用

Literal simple quote inside jinja2 "set" statement

我正在尝试让 mysql 查询在 jinja2 "set" 语句(salt 上下文)中工作,如:

{% set KEY = salt.cmd.shell("mysql -u user -p'password' -D ann -h ann -B -N -e 'select T from ann.USER where NAME='key''") %}

我已经苦思冥想几个小时了,所以如果有人有办法实现这个,请继续!

我尝试了很多(我的意思是很多)不同的组合来完成这项工作,但我做不到。

我想到的最好的是这个 mysql 错误:

ERROR 1054 (42S22) at line 1: Unknown column 'key' in 'where clause'

我可以通过不在 "key" 周围使用简单的引号在 mysql 实例上重现,所以对我来说这确实是一个引用问题。

Jinja2 渲染器在将命令传递给 shell 之前只是删除了简单的引号,对吗?


编辑:

自私的答案起到了作用(非常感谢)但现在我意识到我需要在 "where clause" 中添加一些神社,并且(我猜)因为引用(地狱? ) jinja 变量无法解释。

有没有办法对 where 子句中的列名(键)进行正确的神社解释?

如:

salt.cmd.shell("mysql -uroot -ppassword -h ann -D ann -B -N -e \'select T from ann.USER where NAME=\"{{ key }}\"\' 2>/dev/null; exit 0")

编辑 2: 修复 jinja {{ key }} 的第二个提议失败了:

[salt.state       :275 ][ERROR   ][5947] Unable to manage file: Jinja syntax error: expected token ':', got '}'; line 53

第 53 行是我提出你的第二个提案的地方。

这是我正在使用的实际(已清理)行:

{% set WEBCRMKEY = salt.cmd.shell("mysql -u{{ mysql_user }} -p{{ mysql_password }} -h {{ ann_NAME|join }}.{{ full_domain }} -D ann -B -N -e \'select P from ann.USER where NAME=\"" + {{ CLIENT }} + "\"\'") %}

我想现在是时候说欢迎来到引用地狱

@sel-fish:还有其他提示吗? (那会节省我一周的时间!)

最后一句话

最新的自私提议不错

谢谢

使用反斜杠转义单引号。

shell 命令如下:

salt.cmd.shell("mysql -uroot -ppassword -h ann -D ann -B -N -e \'select T from ann.USER where NAME=\"key\"\' 2>/dev/null; exit 0")

cmd末尾添加2>/dev/null; exit 0,前者是为了过滤mysql命令行工具警告信息,后者是为了避免saltstack警告.

如果键是 jinja variable,则:

salt.cmd.shell("mysql -uroot -ppassword -h ann -D ann -B -N -e \'select T from ann.USER where NAME=\"" + {{ key }} + "\"\' 2>/dev/null; exit 0")

如果要使用更多变量:

salt.cmd.shell("mysql -u" + mysql_user + " -p" + mysql_password + " -h" + ann_NAME + "." + full_domain + " -D ann -B -N -e \'select T from ann.USER where NAME=\"" + key + "\"\' 2>/dev/null; exit 0")