-
Notifications
You must be signed in to change notification settings - Fork 3
/
connectivity-tests.yml
116 lines (103 loc) · 4.38 KB
/
connectivity-tests.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
---
- name: Pre-check | Perform simple connectivity (ping) tests to pre-determine nodes that are offline
hosts: all,!node_offline,!local
tags: always
# become: yes
ignore_unreachable: true
gather_facts: false
# vars_files:
# - vars/vault.yml
tasks:
## https://iautomatelinux.wordpress.com/2019/03/27/ansible-getting-list-of-failed-hosts-and-using-in-a-subsequent-play/
- name: Ping test via module
when: inventory_hostname in ansible_play_hosts_all
block:
- name: Ping test via module ping
when: ansible_os_family|d('')|lower in ['debian', 'redhat']
action: ansible.builtin.ping
register: ping_test
changed_when: false
- name: Ping test via module win_ping
when: ansible_os_family|d('')|lower is search('windows')
action: ansible.windows.win_ping
register: winping_test
changed_when: false
- name: Ping test via module net_ping
delegate_to: localhost
when:
- not (ansible_os_family|d('')|lower in ['debian', 'redhat'])
- not (ansible_os_family|d('')|lower is search('windows'))
ansible.netcommon.net_ping:
dest: "{{ ansible_host }}"
register: netping_test
changed_when: false
- name: display ping test results
ansible.builtin.debug:
msg:
- ping_test={{ ping_test | to_nice_json }}
- winping_test={{ winping_test | to_nice_json }}
- netping_test={{ netping_test | to_nice_json }}
- name: Setting ping_failed[1]
delegate_to: localhost
when:
- not item.skipped|d(false)
ansible.builtin.set_fact:
ping_failed: "{{ item.unreachable|d(item.failed)|d(true) }}"
loop:
- "{{ ping_test }}"
- "{{ winping_test }}"
- "{{ netping_test }}"
rescue:
- name: Additional tests via CLI
block:
- name: ping test via CLI
delegate_to: localhost
become: true
ansible.builtin.command: ping -c 1 -w 2 {{ ansible_host }}
register: ping_cli_test
changed_when: false
- name: Setting ping_failed
ansible.builtin.set_fact:
ping_failed: "{{ ping_cli_test.failed }}"
rescue:
- name: alternative connection test via bash - this assumes we could not run ping for some bizarre reason
delegate_to: localhost
block:
- name: bash connectivity test
become: true
ansible.builtin.command: timeout 3 bash -c '</dev/tcp/{{ ansible_host }}/22'
register: bash_connectivity_test
changed_when: false
ignore_errors: true
- name: display test results
ansible.builtin.debug:
msg:
- ping_cli_test={{ ping_cli_test | to_nice_json }}
- bash_connectivity_test={{ bash_connectivity_test | to_nice_json }}
- name: Setting ping_failed[2]
ansible.builtin.set_fact:
ping_failed: "{{ bash_connectivity_test.unreachable|d(bash_connectivity_test.failed)|d(true) }}"
- name: Display ping_failed
ansible.builtin.debug:
var: ping_failed
## ref: https://github.com/lj020326/ansible-datacenter/blob/main/docs/ansible-unreachable-host-handling.md
- name: Preliminary pre-check connection test host info
run_once: true # noqa: run-once[task]
block:
- name: Set unreachable_hosts
when: hostvars[item].ping_failed|d(true)
ansible.builtin.set_fact:
unreachable_hosts: "{{ unreachable_hosts|d([]) + [item] }}"
loop: "{{ ansible_play_hosts_all }}"
- name: Display pre-check connection info
ansible.builtin.debug:
msg:
- ansible_play_hosts_all={{ ansible_play_hosts_all }}
- ansible_play_hosts={{ ansible_play_hosts }}
- unreachable_hosts={{ unreachable_hosts|d([]) }}
- name: Add unreachable_hosts to group 'node_offline'
when: unreachable_hosts|d([])|length>0
ansible.builtin.add_host:
name: "{{ item }}"
groups: node_offline
loop: "{{ unreachable_hosts }}"