-
Notifications
You must be signed in to change notification settings - Fork 8
/
retrieve_configs.py
72 lines (56 loc) · 2.07 KB
/
retrieve_configs.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
"""
Script to collect running and startup configs from devices
Author: Tafsir Thiam; [email protected]
"""
import asyncio
import os
from pathlib import Path
import typing as t
import yaml
from scrapli import AsyncScrapli
OUTPUT_DIR = Path("configs")
async def gather_config(
device: t.Dict, config_type: str = "running"
) -> t.Tuple[str, str]:
"""Function to retrieve device configurations
:param device: device data with device details
:type device: t.Dict
:return: hostname and config
:rtype: t.Tuple[str, str]
"""
if config_type not in ("running", "startup"):
raise ValueError("config_type must be 'running' or 'startup'")
device.pop("hostname")
conn = AsyncScrapli(**device)
await conn.open()
prompt_result = await conn.get_prompt()
version_result = await conn.send_command(f"show {config_type}-config")
await conn.close()
return prompt_result[:-1], version_result
async def main(inventory: t.Dict) -> None:
"""Gather data from multiple devices defined in inventory
:param inventory: inventory data with device details
:type inventory: t.Dict
"""
devices = inventory.get("devices", [])
for device in devices:
device.update(
{
"auth_username": os.environ["SSH_AUTH_USERNAME"],
"auth_password": os.environ["SSH_AUTH_PASSWORD"],
"transport": inventory.get("transport.transport", "asyncssh"),
"auth_strict_key": inventory.get("auth_strict_key", False),
}
)
tasks = [gather_config(device) for device in devices]
results = await asyncio.gather(*tasks)
# ensure output directory exists
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
# write results to file
for hostname, config in results:
filepath = OUTPUT_DIR / f"{hostname}-running_config.txt"
print(f"saving: {filepath}")
Path(filepath).write_text(config.result)
if __name__ == "__main__":
inventory = yaml.safe_load(open("inventory.yml"))
asyncio.get_event_loop().run_until_complete(main(inventory))