Getting paths right in Windows

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 :slight_smile:

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 :slight_smile: ) - 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!