Let's simplify the variable for testing
cmd: |
"somecommand 'somestring'"
1) The filters *to_yaml* and *to_nice_yaml* will quote the strings
- copy:
dest: /tmp/tempfile
content: "{{ cmd|to_yaml }}"
gives (note the empty line and the closing single-quote
shell> cat /tmp/tempfile
'"somecommand ''somestring''"
'
Remove the trailing new line by adding the dash to the block
cmd: |-
"somecommand 'somestring'"
now the task creates the file
shell> cat /tmp/tempfile
'"somecommand ''somestring''"'
In a single-quoted block, the single-quote is the only character that
have to be escaped; by itself. This is the reason of the 'extra
apostrophes'.
2) Add the dash to your block to remove the new line
somevar:
command:
- run: |-
"somecommand 'somestring' | awk '{print $2}'"
The filter *to_nice_yaml* will quote the string
- copy:
dest: /tmp/tempfile
content: "{{ somevar|to_nice_yaml }}"
gives valid YAML with the list *command* and single item
shell> cat /tmp/tempfile
command:
- run: '"somecommand ''somestring'' | awk ''{print $2}''"'
Read the file and use the command
- include_vars:
file: /tmp/tempfile
- command: "echo {{ command.0.run }}"
register: out
- debug:
var: out.stdout
gives probably what you want
out.stdout: somecommand 'somestring' | awk '{print $2}'
The run-string was properly expanded and used in the command line.
3) If you really want to get rid of the 'extra apostrophes' you'll
have to expand the strings in the template. For example,
- copy:
dest: /tmp/tempfile
content: |
{% for key,val in somevar.items() %}
{{ key }}:
{% for i in val %}
{% for k,v in i.items() %}
- {{ k }}: {{ v }}
{% endfor %}
{% endfor %}
{% endfor %}
gives
shell> cat /tmp/tempfile
command:
- run: "somecommand 'somestring' | awk '{print $2}'"
Note that now the double-quotes are not part of the string stored
in command.0.run
HTH,
--
Vladimir Botka