如何在Ansible(脚本模块)中转义反斜杠和双引号
我是Ansible(2.x)的新手,在使用脚本模块和用双引号和反斜杠传递参数时遇到问题 假设我们有一个集合变量如何在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 \
{{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传递到脚本时使用单引号),这对我很有帮助。非常感谢!