Fix the bug for saving Ansible ping results to a local file

I need some helps for fixing the bug of saving the Ansible ping results to a local file.

Appreciate your help.

Thanks in advance.

Frank

After running the playbook, I got this weird result:

cat /tmp/file.txt

{“ping”: “pong”, “failed”: false, “changed”: false}

Several things here.
You’re saving the result for each host to the same file. So you will end up with just one result, from the last host.
And there is something weird with the inventory you use. Follow the suggestion made by the code (use increased verbosity).

Thanks for the reply.

You’re saving the result for each host to the same file.

Yeah, you’re right. I am not sure how to save the output in Ansible to the output in a file like in shell >> /tmp/file

And there is something weird with the inventory you use…
I had the inventory in /etc/ansible/hosts with:

[test-vms]
test-vm01
test-vm02
test-vm03

Frank

Also, it helps when you clarify what you want to see, instead of “I got this weird result”.

What makes it weird? What were you expecting instead?

What makes it weird?
I wanted to save the ansible ping results to /tmp/file.txt so I can email out the result.

After running the playbook, I just got following saved in /tmp/file.txt:

{“ping”: “pong”, “failed”: false, “changed”: false}

What were you expecting instead?

I added a few lines in the playbook as:

Well as a workaround I could use: ansible-playbook ping_email.yml >> /tmp/file.txt to save the output as a file. But I hope there could be a better way.

Thanks.

Registered results do not contain the full output as seen on the screen. Perhaps you want to set a log file instead, otherwise, you’ll want to use a template and build the output in the format you want. The screen output is controlled by a callback plugin which does extra formatting.

See https://docs.ansible.com/ansible-core/2.14/reference_appendices/config.html#default-log-path

You could change your dest to
dest: “/tmp/file-{{ inventory_hostname }}.txt”
and concatenate them all, but then they won’t contain the host names.

If you don’t like that, then you could register the ping results and loop through them with a template…

You have an invalid character in your group name, by the way. Change the dash to an underscore (probably).

Thanks, Matt.

Perhaps you want to set a log file instead…Well, I don’t want to have the whole log file that contains all details of different play, but only the output of the play.

you’ll want to use a template and build the output in the format you want…
I will look into it.

Frank

It looks like I need to use a template for the task. But saving the screen output for the playbook run should be a very common task. Hope someone can write a module for doing this.

You have an invalid character in your group name, by the way. Change the dash to an underscore (probably).
Yeah, you’re correct.

Thanks.

Frank

- hosts: test-vms
  tasks:
    - name: Ping vms in test-vms
      ansible.builtin.ping:
         register: ping_pong
         ignore_errors: True

- hosts: localhost
  gather_facts: no
  tasks:
    - name: Copy the output result to /tmp/file.txt
      ansible.builtin.template:
          src: ping.j2
          dest: /tmp/file.txt

ping.j2:
{% for host in groups['test-vms'] %}
{{ host }}: {{ hostvars[host]['ping_pong'] }}
{% endfor %}

Hi Brian,

Thanks a lot for the help.

Yes, it works as expected.

I really appreciate that.

Frank