使用命令模块时如何转义引号?

时间:2018-11-27 09:16:58

标签: ansible ansible-2.x

假设我有这个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

3 个答案:

答案 0 :(得分:1)

在Ansible 2.6及更高版本中,可以使用command模块的argv参数将命令提供为列表而不是字符串。这种方法使得在OP的情况下无需转义。

例如:

- command:
  args:
    argv:
      - 'mysql'
      - '-e'
      - GRANT ALL PRIVILEGES ON secrets.* TO boss@'%' IDENTIFIED BY '123456';

参考:command module parameters

我不知道如何在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';\""
}

请参阅:https://adminswerk.de/multi-line-string-yaml-ansible-I/