Print to standard output without escaping

If you want to print some values during debugging or show some message to user with debug module, you may notice that Ansible outputs JSON-encoded strings. There are some tricks to overcome this.

Let's say you want to print some command that should be executed, e.g.: run_me.sh "with this argument".

If you run this task:

- debug:
    msg: run_me.sh "with this argument"

You'll end up with:

ok: [localhost] => {
    "msg": "run_me.sh \"with this argument\""
}

Note that double quotes are escaped, because this is JSON representations of object { "msg": "<string>" }.

You can use some of this tricks to print raw string without JSON-encoding it:

    # Print as loop item
    - name: Print command as loop item
      set_fact:
        dummy: value # Just to make some task without output
      with_items:
        - 'Execute this: run_me.sh "with this argument"'

    # Print as task title
    # Not suitable for different commands per host, because task title is common for all hosts
    - name: 'Execute this: run_me.sh "with this argument"'
      debug:
        msg: Execute command from task title

    # Print as pause statement
    # Not suitable for different commands per host, because pause task skips host loop (forced run_once:yes)
    - name: Print command as pause statment
      pause:
        prompt: 'Execute this and press enter: run_me.sh "with this argument"'

This will produce the following output:

TASK [Print command as loop item] **********************************************
ok: [localhost] => (item=Execute this: run_me.sh "with this argument")

TASK [Execute this: run_me.sh "with this argument"] ****************************
ok: [localhost] => {
    "msg": "Execute command from task title"
}

TASK [Print command as pause statment] *****************************************
[Print command as pause statment]
Execute this and press enter: run_me.sh "with this argument":
ok: [localhost]