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

如何在Ansible(脚本模块)中转义反斜杠和双引号,ansible,Ansible,我是Ansible(2.x)的新手,在使用脚本模块和用双引号和反斜杠传递参数时遇到问题 假设我们有一个集合变量{{foo}},其中包含一个字符串“foo”,我有一个如下任务: set_fact: arg: \(-name "{{foo}}" \) name: call shell module script: path/somescript.sh "{{arg}}" ok: [localhost] => { "arg": "\\(-name \

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

假设我们有一个集合变量
{{foo}}
,其中包含一个字符串“foo”,我有一个如下任务:

set_fact:
   arg: \(-name "{{foo}}" \)
name: call shell module
script: path/somescript.sh "{{arg}}"
ok: [localhost] => {
    "arg": "\\(-name \"bar\" \\)"
}
我的脚本需要以下参数结构才能工作:

\(-name "foo" \)
我尝试了以下几种方法:

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

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

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

有可能在Ansible中避开反斜杠和双引号吗?

你很接近了。我认为您需要设置一个变量,而不是一个事实,我建议您使用
shell
模块,而不是
script
模块<当涉及到转义和引用复杂的shell命令时,code>shell更为宽容

---
- hosts: localhost
  vars:
    foo: test.yml
    arg: \( -name "{{ foo }}" \)
  tasks:
    - debug: var=arg
    - shell: find . {{ arg }}
      register: find
    - debug: var=find.stdout_lines
以及输出:

$ ansible-playbook test.yml 

PLAY [localhost] ***************************************************************

TASK [debug] *******************************************************************
ok: [localhost] => {
    "arg": "\\( -name \"test.yml\" \\)"
}

TASK [command] *****************************************************************
changed: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "find.stdout_lines": [
        "./test.yml"
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0   

不要被ansible playbook以JSON编码的形式打印调试消息这一事实所迷惑,因此一些字符被转义

set_fact:
  arg: \(-name "{{foo}}" \)
你有正确的语法。如果
foo
的值为
bar
,则将
arg
设置为
\(-name“bar”)
但本例中的调试消息如下所示:

set_fact:
   arg: \(-name "{{foo}}" \)
name: call shell module
script: path/somescript.sh "{{arg}}"
ok: [localhost] => {
    "arg": "\\(-name \"bar\" \\)"
}
请注意,JSON的特殊字符(
\
)是转义的

set_fact:
  arg: \(-name "{{foo}}" \)
但将此作为参数传递可能会有一些问题。
如果你这样调用你的脚本

script: path/somescript.sh "{{arg}}"
参数字符串看起来像这样的
“\(-name“bar”\)”
,它实际上是bash中的3个串联字符串:
\(-name
+
bar
+
\)
,因此您将丢失该条周围的双引号

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

script: path/somescript.sh '{{arg}}'

单引号是解决问题的关键。你是对的,当传递到脚本时,角色最终将被转义。我无法提高投票率,因为我的声誉太低,但我的感谢是你的:-)单引号完成了任务。感谢你的回答。我面临着同样的问题。我正在传递一个带有\u项的路径列表。当我使用win时_shell和“{item}}”反斜杠添加不正确。如何在win_shell中使用循环变量?我现在使用的是shell脚本。结合Konstatin Suvorov的答案(作为arg传递到脚本时使用单引号),这对我很有帮助。非常感谢!