【问题标题】:Escape string value for mysql insert/update request in ansibleansible中mysql插入/更新请求的转义字符串值
【发布时间】:2019-11-22 10:54:22
【问题描述】:

我需要创建一个将字符串值插入数据库的 ansible 任务。问题是字符串值可能包含各种空格、引号等。

我打算这样做:

- name: Insert record
  command: mysql db_name -e "INSERT INTO table(column) VALUES ('{{ the_value }}');"

the_value 变量包含字符串,但正如我提到的,其中包含各种空格和引号。所以,它应该被转义。

标准的 ansible quote 过滤器在这里可能不合适,因为它转义了要在 shell 命令中使用的字符串,但我不使用 shell。

这里有一些类似的问题:Insert data into mysql tables using ansible,但对解决转义问题没有帮助。

【问题讨论】:

  • 您是否在ansible-playbook 通话中与the_value 通话?如果是这样,您可以使用包含空格值的缩写版本来发布该调用吗?
  • @WEBjuju 我是 ansible 的新手,所以我不知道 the_value 变量将如何获得它的价值。它的值将从文件中读取 - 该文件应该包含一些配置。只需将此文件的全部内容保存到数据库中即可。

标签: mysql insert ansible escaping


【解决方案1】:

我将 https://stackoverflow.com/a/6478616/2897386https://stackoverflow.com/a/60461596/2897386 的答案结合起来,生成以下代码:

- name: "MySQL escape the_value"
  set_fact:
    the_value: "{{ the_value | regex_replace(item.0, item.1) }}"
  loop:
    - ["\\\\", '\\\\']
    - ["\u0000", '\\0']
    - ["'", "\\'"]
    - ["\"", '\\"']
    - ["\b", '\\b']
    - ["\n", '\\n']
    - ["\r", '\\r']
    - ["\t", '\\t']
    - ["\u001A", '\\Z']

【讨论】:

    【解决方案2】:

    我没有找到合适的过滤器,所以我使用了稍微不同的方法。首先,我将数据保存到运行数据库的主机上的文件中,然后使用LOAD_FILE sql 函数。

    类似这样的:

    - name: Insert record
      command: mysql db_name -e "INSERT INTO table(column) VALUES (LOAD_FILE('{{ path_to_data_file }}'));"
    

    一些笔记。

    • LOAD_FILE 函数可能是 mysql 特定的,因此您可能必须为不同的数据库使用不同的函数/语法

    • 文件应保存在数据库运行的主机上(可能与此任务的远程主机不同)

    • 要将数据保存到远程文件,您可以使用带有content 参数的copy 模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 2016-06-04
      • 2016-09-20
      • 1970-01-01
      • 2020-09-26
      • 2010-11-21
      相关资源
      最近更新 更多