如何在Ansible(脚本模块)中转义反斜杠和双引号

Vet*_*emi 6 ansible

我是Ansible(2.x)的新手,我在使用脚本模块和使用双引号和反斜杠传递参数时遇到了麻烦.

假设我们有一个{{foo}}包含字符串"foo" 的set变量,我有一个这样的任务:

set_fact:
   arg: \(-name "{{foo}}" \)
name: call shell module
script: path/somescript.sh "{{arg}}"
Run Code Online (Sandbox Code Playgroud)

我的脚本需要以下参数结构才能工作:

\(-name "foo" \)
Run Code Online (Sandbox Code Playgroud)

我试过几件事,比如:

arg: \(-name \""{{foo}}"\" \)           result: \\(-name \"foo\" \\)

arg: '\(-name \""{{foo}}"\" \)'         result: \\(-name \"foo\" \\)

arg: \\(-name \""{{foo}}"\" \\)           result: \\(-name \"foo\" \\)
Run Code Online (Sandbox Code Playgroud)

是否有可能在Ansible中逃避反斜杠和双引号?

Kon*_*rov 7

不要因为ansible-playbook以JSON编码形式打印调试消息这一事实而感到困惑,因此某些字符会被转义.

set_fact:
  arg: \(-name "{{foo}}" \)
Run Code Online (Sandbox Code Playgroud)

你有正确的语法.这将设置arg\(-name "bar" \)if foo的值bar.
但在这种情况下调试消息将如下所示:

ok: [localhost] => {
    "arg": "\\(-name \"bar\" \\)"
}
Run Code Online (Sandbox Code Playgroud)

请注意,JSON("\)的特殊字符将被转义.

但是将此作为参数传递可能存在一些问题.
如果你打电话给你脚本,就像这样

script: path/somescript.sh "{{arg}}"
Run Code Online (Sandbox Code Playgroud)

参数字符串看起来像这样"\(-name "bar" \)",实际上是bash中的3个连接字符串:\(-name+ bar+ \),所以你会在条形图周围松开双引号.

如果要保留这些双引号,请使用:

script: path/somescript.sh '{{arg}}'
Run Code Online (Sandbox Code Playgroud)