Send results to localhost (ansible host)

40 views
Skip to first unread message

Alyson Whitaker

unread,
Aug 8, 2017, 2:08:14 PM8/8/17
to Ansible Project
Here is what I am trying to do:

  • Connect to [clientservers] and perform telnet mywebserver.com on port 443, 80, 8443
  • if result = ok (meaning if that port is open), then do nothing.
  • if result = fail,  then send output to failed-clients.txt listing hostname, ip and port that was unreachable


I have successfully completed the first task using this playbook:


---
- hosts: clientservers

  tasks:
  - name: Check all port numbers for current host
    wait_for:
      host: mywebserver.com
      port: "{{ item }}"
      state: started        # Port should be open
      delay: 0              # No wait before first check (sec)
      timeout: 3            # Stop checking after timeout (sec)
    with_items:
      - 443
      - 80
      - 8443
     ignore_errors: yes


I have researched many forums and sites, and I am currently looking at the wait_for and register module.  After reading the following advice:


Fine-tuning output

If you want more specific output for the success and failure cases, the code must be more complex, adding a second task:

  • wait_for task must register a variable
  • the second task produces output using debug based on success/failure condition (e.g. using Jinja2 conditional expression)
  • then you need to put both these tasks in an include file (without any with_items loop), and write a main playbook task that uses an include ... with_items to call the include file once per port.



I'm not sure how to put all this together.  Is it even possible?





Kai Stian Olstad

unread,
Aug 8, 2017, 4:30:03 PM8/8/17
to ansible...@googlegroups.com
On 08. aug. 2017 20:08, Alyson Whitaker wrote:
> Here is what I am trying to do:
>
>
> - Connect to [clientservers] and perform telnet mywebserver.com on port
> 443, 80, 8443
> - if result = ok (meaning if that port is open), then do nothing.
> - if result = fail, then send output to failed-clients.txt listing
> hostname, ip and port that was unreachable
>
>
> I have successfully completed the first task using this playbook:
>
>
> ---
> - hosts: clientservers
>
> tasks:
> - name: Check all port numbers for current host
> wait_for:
> host: mywebserver.com
> port: "{{ item }}"
> state: started # Port should be open
> delay: 0 # No wait before first check (sec)
> timeout: 3 # Stop checking after timeout (sec)
> with_items:
> - 443
> - 80
> - 8443
> ignore_errors: yes
>
>
> I have researched many forums and sites, and I am currently looking at the
> wait_for and register module. After reading the following advice:
>
>
> Fine-tuning output
>
> If you want more specific output for the success and failure cases, the
> code must be more complex, adding a second task:
>
> - wait_for task must register a variable
> - the second task produces output using debug based on success/failure
> condition (e.g. using Jinja2 conditional expression
> <https://stackoverflow.com/a/14215034/992887>)
> - then you need to put both these tasks in an include file (without any
> with_items loop), and write a main playbook task that uses an include
> ... with_items to call the include file once per port.
>
>
>
> I'm not sure how to put all this together. Is it even possible?

Something like this:

- name: Check all port numbers for current host
wait_for:
host: mywebserver.com
port: "{{ item }}"
state: started # Port should be open
delay: 0 # No wait before first check (sec)
timeout: 3 # Stop checking after timeout (sec)
with_items:
- 443
- 80
- 8443
register: result
ignore_errors: yes

- template:
src: port.j2
dest: /tmp/failed-clients.txt
when: result | failed
delegate_to: localhost
run_once: yes

port.j2:
{% for h in ansible_play_batch %}
{% for i in hostvars[h].result.results %}
{% if i.failed is defined %}
{{ h }} failed port {{ i.item }}
{% endif %}
{% endfor %}
{% endfor %}


--
Kai Stian Olstad

Alyson Whitaker

unread,
Aug 9, 2017, 10:27:54 AM8/9/17
to Ansible Project, ansible-pr...@olstad.com
Thank you, I will give it a try.
My greatest challenge is getting the yaml syntax correct!  I will let you know.
Reply all
Reply to author
Forward
0 new messages