On Mon, 20 Feb 2023 07:03:54 -0800 (PST) "gregory....@gmail.com" <gregory.ediga...@gmail.com> wrote:
> Hello, > > having something like this in my playbook > vars: > somevar: > command: > - run: | > "somecommand 'somestring' | awk '{print $2}'" > > tasks: > - name: output var to file > copy: > content: "{{ somevar | to_nice_yaml(sort_keys=false,indent=2) }}" > dest: /tmp/tempfile > > when I look at /tmp/tempfile it looks like ansible doubles apostrophes: > command: > -- run: '"somecommand ''somestring'' | awk ''{print $2}''" > > is there any way to make ansible produce file without extra apostrophes? > > thanks. > 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 -- You received this message because you are subscribed to the Google Groups "Ansible Project" group. To unsubscribe from this group and stop receiving emails from it, send an email to ansible-project+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/20230220175659.1b0cc62f%40gmail.com.
pgpyCI1jHAmyM.pgp
Description: OpenPGP digital signature