목차
- 목표
- 코드 설명
목표
반복작업을 피하기위해 파이썬 스크립트를 작성하고 수집한 결과를 관리하기위해 엑셀파일로 저장
1. 테스트 환경
- Python 3.14
- vscode
- Cisco Nexus switch (OS 9.x 이상)
- 장비 IP를 관리하는 CSV 파일 준비
2. 작업 순서
- CSV 파일의 A열을 참조하여 장비 IP를 읽기
- 장비 IP를 참조하여 API(Requests)를 통해 show 명령어 수행 및 json형태로 저장
- 저장된 json 형식의 데이터에서 hostname, productid, serialnum 데이터 파싱
- 파싱한 데이터를 CSV 파일의 B,C,D열에 삽입 후 저장
코드설명
중간 "*** ***"는 사용자 환경에 맞게 입력
import requests
import json
import os
import pandas as pd
import urllib3
# HTTPS 경고 무시
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# 1. 파일 경로 설정
file_path = *** 파일 경로 ***
# 인증 정보
login_id = *** 장비 계정 ***
login_pwd = *** 장비 암호 ***
try:
# 2. 기존 CSV 파일 읽기
df = pd.read_csv(file_path, encoding='utf-8-sig')
if 'Device IP' not in df.columns:
print("오류: CSV 파일에 'Device IP' 열이 없습니다.")
exit()
# 결과를 담을 리스트 초기화
hostnames = []
product_ids = []
serials = []
print(f"--- {len(df)}개의 장비 분석 시작 ---")
# 3. IP 리스트 순회 (행 단위 반복)
for target_ip in df['Device IP']:
print(f"\n[접속 중] {target_ip} ...")
url = f"https://{target_ip}/ins"
payload = json.dumps({
"ins_api": {
"version": "1.0", "type": "cli_show", "chunk": "0", "sid": "sid",
"input": "show inv ;show hostname", "output_format": "json"
}
})
headers = {'Content-Type': 'application/json'}
# 데이터 초기값 (실패 시 빈값 처리)
h, p, s = "", "", ""
try:
response = requests.request("POST", url, headers=headers, auth=(login_id, login_pwd),
data=payload, verify=False, timeout=10)
if response.status_code == 200:
data = response.json()
output_list = data["ins_api"]["outputs"]["output"]
# Hostname 파싱
h_info = next((item for item in output_list if item["input"] == "show hostname"), None)
h = h_info["body"]["hostname"] if h_info else "Unknown"
# Chassis 정보 파싱
inv_info = next((item for item in output_list if item["input"] == "show inv"), None)
if inv_info:
inv_rows = inv_info["body"]["TABLE_inv"]["ROW_inv"]
c_info = next((item for item in inv_rows if item["name"] == "\"Chassis\""), None)
if c_info:
p = c_info.get("productid", "")
s = c_info.get("serialnum", "")
print(f" > 성공: {h}")
except Exception as e:
print(f" > 접속 에러: {target_ip} ({e})")
# 리스트에 결과 추가
hostnames.append(h)
product_ids.append(p)
serials.append(s)
# 4. 기존 데이터프레임에 새로운 열 추가
# B열: Hostname, C열: Product ID, D열: Serial Number 순서로 삽입
df['Hostname'] = hostnames
df['Product ID'] = product_ids
df['Serial Number'] = serials
# 5. 파일 덮어쓰기 (또는 다른 이름으로 저장)
df.to_csv(file_path, index=False, encoding='utf-8-sig')
print(f"\n--- 업데이트 완료: {file_path} ---")
except Exception as e:
print(f"작업 중 오류 발생: {e}")
-> import requests : Nexus api 사용을 위해 필요
-> import json : json 형식 활용
-> import pandas : CSV 파일 읽기에 활용
-> import urllib3 : https 접근시 인증서 에러 비활성화
-> Requests 모듈? 사용시 Https 에러 무시
-> CSV 파일 경로 지정
-> 장비 인증정보 지정
-> CSV파일에 Device IP 셀을 읽어 df 변수?로 저장
-> 마지막에 수집된 정보를 저장하기 위해 리스트 만들기
-> 저장한 df (Device IP)를 사용하여 url 생성
-> show inv / show hostname 명령어를 수행하도록 input을 설정하고 json 형식으로 output 저장하는 payload 저장
-> requests 모듈?을 사용하여 저장한 url, headers, payload 등 POST
-> 요청 성공시 응답값을 json형태로 저장
-> 저장된 값의 "body" "hostname"에 위치한? 저장된? 값을 파싱
-> 저장된 값의 "body" "TABLE_inv" "ROW_inv"에 저장된 값 중 Chassis의 하위값 productid, resialnum를 저장
-> 결과를 리스트에 저장
-> 기존 IP만 있던 CSV파일의 B,C,D열에 각각 Hostname, Product ID, Serial Number를 추가하고 아래 데이터를 저장
코드 실행결과 관리하는 장비의 IP목록을 기준으로 필요한 Hostname, Product ID, Serial Number를 자동으로 수집 및 저장
정상 실행되는 모습