목차

  1. 목표
  2. 코드 설명

목표

반복작업을 피하기위해 파이썬 스크립트를 작성하고 수집한 결과를 관리하기위해 엑셀파일로 저장

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를 자동으로 수집 및 저장

 

정상 실행되는 모습

 

 

+ Recent posts