首页 > 解决方案 > 如何在执行期间注册的 ansible 变量中转义单引号。我不能使用“\”,因为变量在注册之前是未知的

问题描述

当一个注册的变量中有一个单引号时,例如如果值var.stdoutIxMy5NPG'dCbrHD注意字符串中的单引号

当我在即将到来的任务中使用这个变量时,

lineinfile:
  path: /path/to/file.j2 
  regexp: "X1234" 
  line: {{ var.stdout }} 
  mode: 0755 
  state: present

我收到以下错误

ERROR! failed at splitting arguments, either an unbalanced 
jinja2 block or quotes

仅当字符串中有单引号时才会发生这种情况,可能有也可能没有单引号。因此,我不能期待并处理它。我在变量上尝试了一个 regex_replace 过滤器,就像{{ var.stdout | regex_replace("'", "\'") }} 我得到“模块执行期间意外失败”一样。

标签: ansible

解决方案


表达式{{ var.stdout }}必须被引用

lineinfile:
  path: file.j2 
  regexp: X1234
  line: {{ var.stdout }}  # <-- WRONG

例如,给定文件

shell> cat file.j2
X1234

下面的任务

lineinfile:
  path: file.j2 
  regexp: X1234
  line: "{{ var.stdout }}"  # <-- CORRECT

按预期工作

shell> cat file.j2
IxMy5NPG'dCbrHD

例如,如果您想用下划线“_”替换引号

    - set_fact:
        var_stdout: "{{ var.stdout|regex_replace(_regex, _replace) }}"
      vars:
        _regex: "'"
        _replace: "_"

  var_stdout: IxMy5NPG_dCbrHD

为避免转义,请将 _regex/_replace 放入任务的变量中。


如果你想逃避报价

        _replace: "\\'"

  var_stdout: IxMy5NPG\'dCbrHD

推荐阅读