Hope someone can help me shed some light on this one:
Since Ansible is python-based, us Windows dudes generally have to stick an extra backslash anywhere we’re manipulating Windows paths. However, in some cases this causes unexpected behavior. In my current case, I need to inject a file path into a json file on a Windows box. This path is defined as such in an Ansible var:
logfiles_path: “F:\Logs”
In my template json file I add to this path, using the following:
“FilePath”:“{{ logfiles_path }}\*”,
The goal is to populate the target json with
“F:\Logs\*”
However, since Ansible kicks in the resulting file contains:
“F:\Logfiles\*”
In other words, Ansible “normalises” the part of the path that comes from a variable, but not the part “outside” of the variable.
I’m not sure what the best way to solve this is - it would be great to have some builtin filters that would do “json normalization” of a string or something. How are people solving this?
I stick to using single backslashes (and not quotes) in YAML, or single quotes if you have to. And single quotes everywhere else. I never had the need to use double-backslashes.
I remember one issues (with YAML?), which is when using a trailing backslash. So I taught myself not to do this for Windows paths
It would be nice to document these best-practices as part of the Ansible Windows documentation once we have determined what's best.
I’m not seeing the behaviour you describe - maybe my playbook isn’t doing the same things as yours though?
playbook:
$ cat trondpath.yml
To me it looks like you’re getting the same as me (I had to zoom in my screen to be sure ) - contents of templated json contains a single backslash after the drive letter (which is not valid)
These Json files might be read by applications that are not able to parse “forward-slashed” paths, so although Powershell would be fine with that format, it’s not always an option to use them in json files (so essentially this is not as much a problem with the Powershell-based Ansible modules as the fact that its hard to inject valid json into json files).
I’ll look into the win_* filter - I haven’t spent much time with those (I kinda wish they were a bit better documented)
I’ll keep this thread updated with my findings.
Sorry, trying to help too early in the morning!. I had missed the single \ in the path.
Not tried but have noticed jinja2 has a ‘tojson’ filter that might help (new in 2.9 so maybe ‘pip install Jinja2 --upgrade’ might be needed, although I think installing ansible 2.3 from pip will drag this in, if I recall. Also there’s a ‘safe’ filter which might stop automatic escaping from happening.
http://jinja.pocoo.org/docs/2.9/templates/
Hope this helps,
Jon
Thanks, will check those out!