我试图让一个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 }} + "\"\'") %}
我想现在是时候欢迎引用地狱了。
最后一句话
最新的自我命题是好的。
由于
答案 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")