본문 바로가기
Virtualization & Cloud/Network Automation

네트워크 자동화 (Network Automation) - (1)

by TwoJun 2024. 8. 6.
728x90
반응형

2024-08-05(MON)

 

 

(1) 금일 예정

- Network Automation Practice

- python code

- pyqt5 - gui design

- GUI + Python code

 

 

 

01. 전일 내용 - Network Automation

01-1. 자동화의 개념

(1) 자동화는 인간의 개입 없이, 특정 인프라에 대한 설치, 설정 및 관리를 기계나 시스템이 직접 수행하는 것을 말한다.

 

(2) 이를 통해 인력 투입이 줄어들고 생산성이 향상된다.

 

(3) 자동화를 수행하며 데이터들이 쌓이고 이를 분석함으로써 의미 있는 결과값을 도출해냄으로써 향상된 프로세스로 발전할 수 있다.

 

 


02. 전일 내용 - 데이터 형식

(1) man - machine interface - Html

Machine to Machine - XML, JSON, YAML(Key:value type)

 

 

 


03. 전일 내용 - API

(1) Application Programming Interface의 약자로, 소프트웨어 간의 상호작용을 가능하게 하는 인터페이스를 의미한다. 이러한  API는 서로 다른 소프트웨어 시스템이 데이터를 주고받거나 기능을 호출할 수 있게 해주는 일종의 계약이나 규칙을 말한다.

 

(2) SOAP, REST API, XML-RPC, JSON-RPC

 

 

 


04. 전일 내용 - 구성관리 도구

(1) 자동화에서의 구성 관리 도구는 인프라 시스템의 설정과 배포를 자동화하고 관리하는 데 도움을 주는 소프트웨어를 말한다.

 

(2) 종류로는 Ansible, Puppet, Chef, Salt stack이 있다.

 

 

 

 

 

 

1. Win10 Pnet Configuration

1-1. Switch, Router configuration

(1) admin 유저에 대한 패스워드를 지정하고 user mode → privileged mode로 접속을 위한 비밀번호를 설정한다.

 

conf t

line vty 0 4

password cisco

login local

transport input telnet

username admin password cisco

enable password cisco

 

Switch, Router configuration

 

(2) 기본적으로 user mode -> privilege mode로 접근 시 일반적으로 password를 입력하는 인증 과정을 거치게 된다.

 

 

 

 

1-2. Windows 10에서 putty로 접속 시

Windows 10에서 putty로 접속 시

 

 

 

 

1-3. 외부와의 인터넷 접속을 위해 새로운 주소대역 설정

(1) 가상 머신 설정에서 VM Network로 새로운 이더넷 어댑터 추가 후 주소 부여

가상 머신 설정에서 VM Network로 새로운 이더넷 어댑터 추가 후 주소 부여

 

 

 

 

 

 

2. Router 추가 후 configuration

2-1. command line

 

 

 

 

2-2. topology

 

 

 

 

2-3. Win 10에서 Router로 ping test

 

(1) router에서 switch로 ping test

router에서 switch로 ping test

 

 

 

 

 

 

3. Qt Designer Configuration

3-1. anaconda prompt 실행 후 desginer 실행

 

 

 

 

3-2. Qt Designer에서 Layer Design 속성값들 할당

(1) 메인 화면의 label → pixmap에서 이미지 선택

 

 

(2) Text Browser, Text Label, Text Edit  → objectName에서 필드에 대한 변수명 할당 가능

 

 

 

 

3-3. Configuration 반영 방법

(1) UI 반영 이후 반영된 부분에 대한 python 코드 반영

 

(2) pyuic5 파일명.ui -o 파일명.py

pyuic5 파일명.ui -o 파일명.py

 

pyuic5 network_config.ui -o network_config.py

 

 

(3) 이후 아래의 코드를 생성된 network_config(파일명).py 맨 아래 부분에 복사해서 붙여넣는다.

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

 

 

 

 

 

 

 

4. Router Practice Lab

4-1. network_config01.py

from PyQt5 import QtCore, QtGui, QtWidgets
import telnetlib

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QtCore.QRect(0, 0, 581, 481))
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.label = QtWidgets.QLabel(self.tab)
        self.label.setGeometry(QtCore.QRect(0, 0, 701, 451))
        self.label.setText("")
        self.label.setPixmap(QtGui.QPixmap("dataCenter.png"))
        self.label.setObjectName("label")
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setObjectName("tab_2")
        self.tabWidget.addTab(self.tab_2, "")
        self.tab_3 = QtWidgets.QWidget()
        self.tab_3.setObjectName("tab_3")
        self.userId = QtWidgets.QLabel(self.tab_3)
        self.userId.setGeometry(QtCore.QRect(10, 30, 71, 16))
        self.userId.setObjectName("userId")
        self.label_3 = QtWidgets.QLabel(self.tab_3)
        self.label_3.setGeometry(QtCore.QRect(210, 30, 56, 12))
        self.label_3.setObjectName("label_3")
        self.label_4 = QtWidgets.QLabel(self.tab_3)
        self.label_4.setGeometry(QtCore.QRect(360, 30, 56, 12))
        self.label_4.setObjectName("label_4")
        self.UserID = QtWidgets.QTextEdit(self.tab_3)
        self.UserID.setGeometry(QtCore.QRect(90, 20, 101, 31))
        self.UserID.setObjectName("UserID")
        self.PWDText = QtWidgets.QLineEdit(self.tab_3)
        self.PWDText.setGeometry(QtCore.QRect(250, 20, 101, 31))
        self.PWDText.setEchoMode(QtWidgets.QLineEdit.Password)
        self.PWDText.setObjectName("PWDText")
        self.HOSTIp = QtWidgets.QTextEdit(self.tab_3)
        self.HOSTIp.setGeometry(QtCore.QRect(420, 20, 111, 31))
        self.HOSTIp.setObjectName("HOSTIp")
        self.plainTextEdit = QtWidgets.QPlainTextEdit(self.tab_3)
        self.plainTextEdit.setGeometry(QtCore.QRect(10, 60, 531, 341))
        self.plainTextEdit.setObjectName("plainTextEdit")
        self.RouterBtn = QtWidgets.QPushButton(self.tab_3)
        self.RouterBtn.setGeometry(QtCore.QRect(270, 410, 75, 23))
        self.RouterBtn.setObjectName("RouterBtn")
        self.RouterBtn.clicked.connect(self.RouterConfig)
        self.tabWidget.addTab(self.tab_3, "")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(2)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def RouterConfig(self):
        print("RouterConfig")
        print("사 용 자 : ", self.UserID.toPlainText())
        user = self.UserID.toPlainText()
        print("암   호  :", self.PWDText.text())
        password = self.PWDText.text()
        print("Host IP : ", self.HOSTIp.toPlainText())
        HOST = self.HOSTIp.toPlainText()

        tn = telnetlib.Telnet(HOST)

        tn.read_until(b"Username: ")
        tn.write(user.encode('ascii') + b"\n")

        if password:
            tn.read_until(b"Password: ")
            tn.write(password.encode('ascii') + b"\n")

        tn.write(b"enable\n")
        tn.write(b"cisco\n")
        tn.write(b"conf t\n")

        wk_Contents = self.plainTextEdit.toPlainText()
        # 실제 타이핑을 통해 동적으로 설정을 주는 구간
        print(wk_Contents)
        print(type(wk_Contents))
        w_txt = wk_Contents.split("\n")
        print(type(w_txt))
        for data in w_txt:
            print(data)
            tn.write(data.encode('ascii') + b"\n")

        # tn.write(b"int loopback 7 \n")
        # tn.write(b"ip add 7.7.7.7 255.255.255.255 \n")
        tn.write(b"end \n")
        tn.write(b"exit \n")
        print(tn.read_all().decode('ascii'))

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "초기 화면"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Switch 설정"))
        self.userId.setText(_translate("MainWindow", "사용자 이름 :"))
        self.label_3.setText(_translate("MainWindow", "암호 :"))
        self.label_4.setText(_translate("MainWindow", "IP 주소 :"))
        self.RouterBtn.setText(_translate("MainWindow", "설정"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Router 설정"))

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

 

 

 

 

 

4-2. Router에 실제로 설정이 반영되는지 확인 

(1) network_config01.py 파일 Run 수행 

(2) 이후 아래와 같이 loopback int 지정

 

 

(3) 진행하면 아래와 같이 라우터 장비에 반영된 커맨드들이 나열된다.

 

 

 

(4) 실제 라우터 장비에 대해 putty로 접속해서 커맨드를 수행한 부분이 반영된 것을 확인할 수 있다.

 

 

 

 

 

 

 

※ 해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.

개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있으며, 이에 대해 댓글로 알려주시면 감사하겠습니다!

728x90
반응형

댓글