我是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中逃避反斜杠和双引号?
不要因为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)