vault_win_password: foo20"
location: C:\Program files (x86)\bar
- name: Test login script: "{{ role_path }}/files/portal.ps1 {{ dbuser }} {{ vault_win_password }}"
The full traceback is:Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/ansible-2.5.1-py2.7.egg/ansible/executor/task_executor.py", line 138, in run res = self._execute() File "/usr/local/lib/python2.7/dist-packages/ansible-2.5.1-py2.7.egg/ansible/executor/task_executor.py", line 558, in _execute result = self._handler.run(task_vars=variables) File "/usr/local/lib/python2.7/dist-packages/ansible-2.5.1-py2.7.egg/ansible/plugins/action/script.py", line 79, in run parts = [to_text(s, errors='surrogate_or_strict') for s in shlex.split(raw_params.strip())] File "/usr/lib/python2.7/shlex.py", line 279, in split return list(lex) File "/usr/lib/python2.7/shlex.py", line 269, in next token = self.get_token() File "/usr/lib/python2.7/shlex.py", line 96, in get_token raw = self.read_token() File "/usr/lib/python2.7/shlex.py", line 172, in read_token raise ValueError, "No closing quotation"ValueError: No closing quotation
fatal: [sj-aio01]: FAILED! => { "msg": "Unexpected failure during module execution.", "stdout": ""}
- name: Test location script: "{{ role_path }}/files/file.ps1 {{ location}}"
fatal: [sj-can02]: FAILED! => { "changed": true, "msg": "non-zero return code", "rc": 1, "stderr": "x86 : The term 'x86' is not recognized as the name of a cmdlet, function, \r\nscript file, or operable program. Check the spelling of the name, or if a path \r\nwas included, verify that the path is correct and try again.\r\nAt line:1 char:122\r\n+ ... 42148.17-152711404220483\\cannister.ps1' C:\\Program Files (x86)\\IBM\\IB ...\r\n+ ~~~\r\n + CategoryInfo : ObjectNotFound: (x86:String) [], CommandNotFound \r\n Exception\r\n + FullyQualifiedErrorId : CommandNotFoundException\r\n \r\n\r\n", "stdout": "", "stdout_lines": []}
- name: Test location script: "{{ role_path }}/files/file.ps1 \'{{ location}}\'"
ERROR! Syntax Error while loading YAML. found unknown escape character "'"
fatal: [sj-aio01]: FAILED! => {"msg": "template error while templating string: unexpected char u'\"' at 10. String: {{foo20\"}}"}
script: "{{ role_path }}/files/portal.ps1 {{ dbuser }} {{ vault_win_password }}"
# when taking away Jinja2 this becomes
script: /some/path/files/portal.ps1 user foo20"
When trying to turn the string to a list of arguments ([portal.ps1", "user", "foo20\""]), it fails to find the end quote for the password quote. What you need to do is use the quote filter to automatically quote each argument, e.g.
script: "{{ role_path }}/files/portal.ps1 {{ dbuser|quote }} {{ vault_win_password|quote }}"
# if you wanted to do it manually without the quote filter (please don't)
script: "{{ role_path }}/files/portal.ps1 '{{ dbuser }}' '{{ vault_win_password }}'"
# when taking away Jinja2 this become
script: /some/path/files/portal.ps1 "user" "foo20\""
This means each argument is quoted so shlex can split them into a list without any issues.
You second issue also comes down to quotes, when interpreting this
script: "{{ role_path }}/files/file.ps1 {{ location }}"
# this is seen by Ansible as
script: /some/path/files/portal.ps1 C:\Program Files (x86)\bar
When running in Windows, it sees this as 3 different arguments; ["C:\Program", "Files", "(x86)\bar"] as it is not quoted. PowerShell makes this a bit more complex, the 3rd argument (x86)\bar, PowerShell see the brackets and things the value inside is a command and so tries to run it which in turn leads to the error x86 is not recognized as the name of a cmdlet, function... The fix for this is the same as your previous issue, use the quote filter to quote the values
script: "{{ role_path }}/files/file.ps1 {{ location }}"
# without using the quote filter this is how it can be done (once again please don't this is just to illustrate how it could be done)
script: "{{ role_path }}/files/file.ps1 \"{{ location }}\""
# or
script: "{{ role_path }}/files/file.ps1 '{{ location }}'"
# this is seen by Ansible as
script: /some/path/files/portal.ps1 "C:\Program Files (x86)\bar"
Now because the path is quoted, it is seen as 1 argument instead of 3.
Thanks
Jordan