我对Ansible(2.x)很新,我在使用脚本模块和使用双引号和反斜杠传递参数时遇到了麻烦。
假设我们有一个包含字符串“foo”的集变量{{foo}}
,我有一个这样的任务:
set_fact:
arg: \(-name "{{foo}}" \)
name: call shell module
script: path/somescript.sh "{{arg}}"
我的脚本需要以下参数结构才能工作:
\(-name "foo" \)
我试过了几件事,比如:
arg: \(-name \""{{foo}}"\" \) result: \\(-name \"foo\" \\)
arg: '\(-name \""{{foo}}"\" \)' result: \\(-name \"foo\" \\)
arg: \\(-name \""{{foo}}"\" \\) result: \\(-name \"foo\" \\)
是否有可能在Ansible中转义反斜杠和双引号?
答案 0 :(得分:7)
不要因为ansible-playbook以JSON编码形式打印调试消息而感到困惑,因此有些字符会被转义。
set_fact:
arg: \(-name "{{foo}}" \)
您的语法正确。如果arg
的值为\(-name "bar" \)
,则会将foo
设置为bar
。
但在这种情况下,调试消息将如下所示:
ok: [localhost] => {
"arg": "\\(-name \"bar\" \\)"
}
请注意,JSON("
和\
)的特殊字符会被转义。
但是将此作为参数传递可能存在一些问题 如果你打电话给你脚本,就像这样
script: path/somescript.sh "{{arg}}"
参数字符串看起来像这个"\(-name "bar" \)"
,实际上是bash中的3个连接字符串:\(-name
+ bar
+ \)
,所以你会在<{1}}周围松开双引号EM>杆
如果要保留这些双引号,请使用:
script: path/somescript.sh '{{arg}}'
答案 1 :(得分:1)
你非常接近。我想你想设置一个变量,而不是事实,我建议你使用shell
模块而不是script
模块。在转义和引用复杂的shell命令时,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