-
Notifications
You must be signed in to change notification settings - Fork 0
/
run.py
executable file
·149 lines (130 loc) · 4.78 KB
/
run.py
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/usr/bin/env python3
"""
Необходимо:
1.Собрать со всех устройств файлы конфигураций, сохранить их на диск,
используя имя устройства и текущую дату в составеимени файла.
2. Проверить на всех коммутаторах-включен ли протокол CDP и есть ли
упроцесса CDPна каждом из устройств данные о соседях.
3. Проверить, какой типпрограммного обеспечения(NPEили PE)* используется
на устройствах исобрать со всех устройств данные о версиииспользуемого ПО.
4. Настроить на всех устройствах timezone GMT+0, получение данных для
синхронизациивремени от источника во внутренней сети, предварительно
проверив его доступность.
5. Вывести отчет в виде нескольких строк,
каждая изкоторых имеет следующийформат, близкий к такому:
Имя устройства
- тип устройства
- версия ПО
- NPE/PE
- CDP on/off, Xpeers
- NTP in sync/not sync.
Пример:
ms-gw-01|ISR4451/K9|BLD_V154_3_S_XE313_THROTTLE_LATEST |PE |CDP is ON,5peers |Clock in Sync
ms-gw-02|ISR4451/K9|BLD_V154_3_S_XE313_THROTTLE_LATEST |NPE|CDP is ON,0 peers|Clock in Sync
"""
import argparse
import yaml
from netmiko import ConnectHandler, Netmiko
from concurrent.futures import ThreadPoolExecutor, as_completed
from prettytable import PrettyTable
from tools import (
get_configs,
get_cdp_status,
get_version,
config_ntp
)
from config import (
INVENTORY,
USERNAME,
PASSWORD,
SECRET
)
def main():
parser, args = get_args()
# Загружаем список хостов
try:
with open(INVENTORY) as f:
hosts = yaml.load(
f.read(),
Loader=yaml.Loader
)
except Exception as e:
exit(e)
# Определяем, какие задания необходимо выполнить
fields = ["Host"]
jobs = []
if args.get_version:
jobs.append(get_version)
fields.append("Software Version")
if args.get_cdp_status:
jobs.append(get_cdp_status)
fields.append("CDP status")
if args.config_ntp:
jobs.append(config_ntp)
fields.append("NTP status")
if args.get_configs:
jobs.append(get_configs)
fields.append("Config status")
# Если нет заданий, просто выводим помощь
if len(jobs) == 0:
parser.print_help()
else:
# Инициализируем таблицу для вывода данных
table = PrettyTable()
# Выполняем задачи для хостов в 4 потока
with ThreadPoolExecutor(max_workers=4) as ex:
future = {ex.submit(worker, host, jobs) for host in hosts}
for future in as_completed(future):
table.add_row(future.result())
# Итоговая таблица с данными
table.field_names = fields
print(table)
def worker(host, jobs):
""" Обработчик заданий
"""
device = {
"device_type": "cisco_ios",
"host": host,
"username": USERNAME,
"password": PASSWORD,
"secret": SECRET
}
con = Netmiko(**device)
if con.find_prompt():
device = {
"con": con,
"host": host
}
result = [host]
for job in jobs:
result.append(job(**device))
return result
else:
return "Не удалось подключиться к f{host}"
def get_args():
""" Парсер аргументов командной строки
"""
parser = argparse.ArgumentParser(prog="DEVNET")
parser.add_argument(
"--get_configs",
action='store_true',
help="Собрать конфигурации со всех устройств"
)
parser.add_argument(
"--config_ntp",
action='store_true',
help="Настроить NTP на всех устройствах"
)
parser.add_argument(
"--get_cdp_status",
action='store_true',
help="Вывести статус CDP и количество соседей"
)
parser.add_argument(
"--get_version",
action='store_true',
help="Вывести версию ПО"
)
return parser, parser.parse_args()
if __name__ == "__main__":
main()