假设我有这个SQL查询:
GRANT ALL PRIVILEGES ON secrets.* TO boss@'%' IDENTIFIED BY '123456';
,我希望使用Ansible的command
模块来运行该查询。在普通外壳上,我会这样做:
mysql -e 'GRANT ALL PRIVILEGES ON secrets.* TO boss@''%'' IDENTIFIED BY ''123456'';'
使用command
模块如何实现等效?
我尝试过:
- command: mysql -e 'GRANT ALL PRIVILEGES ON secrets.* TO boss@''%'' IDENTIFIED BY ''123456'';'
但这会导致错误。
请注意,我知道command
模块不是进行SQL查询的最佳方法。这个问题的目的是找出如何正确地为command
模块加上引号。
Ansible版本:2.7.1
答案 0 :(得分:1)
在Ansible 2.6及更高版本中,可以使用command
模块的argv
参数将命令提供为列表而不是字符串。这种方法使得在OP的情况下无需转义。
例如:
- command:
args:
argv:
- 'mysql'
- '-e'
- GRANT ALL PRIVILEGES ON secrets.* TO boss@'%' IDENTIFIED BY '123456';
我不知道如何在2.6以下的Ansible版本中实现等效。我会留给别人回答。
答案 1 :(得分:0)
使用\
转义引号应该可以
command: "mysql -e \'GRANT ALL PRIVILEGES ON secrets.* TO boss@\'%\' IDENTIFIED BY \'123456\';\'"
答案 2 :(得分:0)
也许您可以将SQL命令定义为变量(折叠)
---
- name: "Testing"
become: yes
hosts: localhost
gather_facts: no
vars:
sql: >-
"GRANT ALL PRIVILEGES ON secrets.* TO boss@'%'
IDENTIFIED BY '123456';"
tasks:
- name: "SQL Test"
debug:
msg: "mysql -e {{ sql }}"
输出:
TASK [SQL Test]
************************************************************************
ok: [localhost] => {
"msg": "mysql -e \"GRANT ALL PRIVILEGES ON secrets.* TO boss@'%' IDENTIFIED BY '123456';\""
}