I'm very new to Ansible (2.x) and I am having trouble using the script module and passing parameters with double quotes and backslashes.
Assuming we have a set variable {{foo}}
which contains a string "foo", I have a task like this:
set_fact:
arg: \(-name "{{foo}}" \)
name: call shell module
script: path/somescript.sh "{{arg}}"
My script needs the following structure of the argument in order to work:
\(-name "foo" \)
I tried several things such as:
arg: \(-name \""{{foo}}"\" \) result: \\(-name \"foo\" \\)
arg: '\(-name \""{{foo}}"\" \)' result: \\(-name \"foo\" \\)
arg: \\(-name \""{{foo}}"\" \\) result: \\(-name \"foo\" \\)
Is it possible to escape backslashes and double quotes in Ansible?
You're very close. I think you want to set a variable, not a fact, and I would suggest you use the
shell
module instead of thescript
module.shell
is more forgiving when it comes to escaping and quoting complex shell commands.And the output:
Don't be confused by the fact that ansible-playbook prints debug messages in JSON encoded form, so some characters are escaped.
You have correct syntax. This will set
arg
to\(-name "bar" \)
iffoo
's value isbar
.But the debug message in this case will look like this:
Note that special characters for JSON (
"
and\
) are escaped.But there may be some issues with passing this as parameter.
If call you script, like this
Parameters string will look like this
"\(-name "bar" \)"
which is actually 3 concatenated strings in bash:\(-name
+bar
+\)
, so you will loose double quotes around the bar.If you want to preserve those double quotes, use: