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

492 views
Skip to first unread message

Frank Ling

unread,
Dec 6, 2022, 2:53:56 PM12/6/22
to Ansible Project
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}

============================================

Here is the playbook:

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

    - name: Copy the output result to /tmp/file.txt
      ansible.builtin.copy:
          content: "{{ ping_pong }}"
          dest: /tmp/file.txt

===================================================

$ ansible-playbook ping_email.yml
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
[WARNING]: Found both group and host with same name: localhost

PLAY [test-vms] ********************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
ok: [test-vm03]
ok: [test-vm02]
ok: [test-vm01]

TASK [Ping vms in test-vms] ********************************************************************************************
ok: [test-vm03]
ok: [test-vm02]
ok: [test-vm01]

TASK [Copy the output result to /tmp/file.txt] *************************************************************************
changed: [test-vm01]
changed: [test-vm02]
changed: [test-vm03]

PLAY RECAP *************************************************************************************************************
test-vm01                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
test-vm02                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
test-vm03                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

Dick Visser

unread,
Dec 6, 2022, 3:00:48 PM12/6/22
to ansible...@googlegroups.com
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). 



--
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-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/15123a9a-fc1c-4b8b-8a0a-2f24cf9a06a6n%40googlegroups.com.
--
Sent from Gmail Mobile

Frank Ling

unread,
Dec 6, 2022, 3:09:51 PM12/6/22
to Ansible Project
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

Matt Martz

unread,
Dec 6, 2022, 3:21:44 PM12/6/22
to ansible...@googlegroups.com
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?



--
Matt Martz
@sivel
sivel.net

Frank Ling

unread,
Dec 6, 2022, 3:34:47 PM12/6/22
to Ansible Project
>>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:

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

    - name: Ping result
      ansible.builtin.ping:
      register: ping_screen

    - name: Ping the result to the screen
      ansible.builtin.debug:
         var: ping_screen



    - name: Copy the output result to /tmp/file.txt
      ansible.builtin.copy:
          content: "{{ ping_pong }}"
          dest: /tmp/file.txt

When I ran it, the ping result would show on the screen as following and I would like to save following result to /tmp/file.txt:

...

TASK [Ping the result to the screen] ***********************************************************************************
ok: [test-vm01] => {
    "ping_screen": {
        "changed": false,
        "failed": false,
        "ping": "pong"
    }
}
ok: [test-vm02] => {
    "ping_screen": {
        "changed": false,
        "failed": false,
        "ping": "pong"
    }
}
ok: [test-vm03] => {
    "ping_screen": {
        "changed": false,
        "failed": false,
        "ping": "pong"
    }
}

....


Frank Ling

unread,
Dec 6, 2022, 4:02:01 PM12/6/22
to Ansible Project
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.

Matt Martz

unread,
Dec 6, 2022, 4:05:27 PM12/6/22
to ansible...@googlegroups.com
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.


Todd Lewis

unread,
Dec 6, 2022, 4:13:36 PM12/6/22
to Ansible Project
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).

Frank Ling

unread,
Dec 6, 2022, 4:45:57 PM12/6/22
to Ansible Project
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

Frank Ling

unread,
Dec 6, 2022, 4:49:16 PM12/6/22
to Ansible Project
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

Brian Coca

unread,
Dec 6, 2022, 5:22:29 PM12/6/22
to ansible...@googlegroups.com
- 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 %}

--
----------
Brian Coca

Frank Ling

unread,
Dec 7, 2022, 8:36:09 AM12/7/22
to Ansible Project
Hi Brian,

Thanks a lot for the help. 

 Yes, it works as expected. 

I really appreciate that. 

Frank  
Reply all
Reply to author
Forward
0 new messages