jinja2" set"中的简单引用声明

时间:2018-03-17 15:04:32

标签: jinja2 salt-stack

我试图让一个mysql查询在jinja2" set"声明(盐上下文),如:

{% 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之前删除简单的引用,我是对的吗?

编辑:

sel-fish的答案起了作用(非常感谢)但是现在我意识到我需要在" where子句"和(我猜)中添加一些jinja因为引用(地狱?)jinja变量无法解释。

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

如:

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:还有其他提示吗? (这会节省我的一周!)

最后一句话

最新的自我命题是好的。

由于

1 个答案:

答案 0 :(得分:1)

使用反斜杠转义单引号。

shell cmd如下所示:

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")