Doctor Pepper

GNS3와 Ansible을 이용한 네트워크 구성(1) 본문

Network 심화/GNS3-Ansible

GNS3와 Ansible을 이용한 네트워크 구성(1)

Doctor Pepper 2024. 10. 22. 20:31
728x90

 

 Ansible은 IT 자동화, 구성 관리 및 애플리케이션 배포를 위한 오픈 소스 도구이다. 간단하고 효율적인 YAML 기반의 플레이북을 통해 서버 및 네트워크 장치를 자동화할 수 있도록 설계되었다.

 

1. Ansible

https://docs.ansible.com/ansible/latest/modules/list_of_network_modules.html
  • 자동화 도구: Ansible은 수동으로 수행하던 작업을 자동화하여 시스템 관리자의 작업 부담을 줄이고, 일관성을 유지하며, 오류를 최소화한다.
  • 구성 관리: Ansible은 서버와 애플리케이션의 구성을 정의하고 관리하여, 동일한 환경에서 일관된 상태를 유지할 수 있도록 돕는다.
  • 인프라스트럭처 as 코드(IaC): Ansible은 인프라를 코드로 정의함으로써, 서버 배포 및 관리를 코드 형태로 버전 관리할 수 있게 한다.

 

2. 특징

 

  • 에이전트리스(Agentless): Ansible은 에이전트나 추가 소프트웨어 없이 SSH 또는 WinRM을 통해 원격 시스템에 연결하여 작업을 수행한다. 이로 인해 설치 및 관리가 간편하다.
  • YAML 기반의 플레이북: Ansible은 플레이북이라는 YAML 형식의 파일을 사용하여 자동화 작업을 정의한다. 직관적인 문법 덕분에 이해하기 쉽고, 가독성이 높다.
  • 모듈화: Ansible은 다양한 모듈을 제공하여 네트워크 장치, 클라우드 서비스, 데이터베이스 등 다양한 시스템을 쉽게 관리할 수 있도록 한다. 사용자는 필요에 따라 자신의 모듈을 추가하거나 수정할 수도 있다.
  • 다양한 플랫폼 지원: Ansible은 Linux, Windows, 네트워크 장치 등 다양한 플랫폼을 지원하며, 멀티 클라우드 환경에서도 작동한다.
  • 상태 관리: Ansible은 선언적 구성을 통해 원하는 상태를 정의하고, 시스템이 그 상태를 유지하도록 한다. 이를 통해 시스템의 일관성을 보장할 수 있다.
  • 재사용 가능성: Ansible은 역할(roles)을 사용하여 재사용 가능한 자동화 코드를 만들 수 있다. 역할은 관련된 작업을 그룹화하여 관리할 수 있게 한다.

 

 

3. Ansible 예제

<전체 네트워크 구성도>

 

GNS3를 실행하고 새 프로젝트를 만든다.

 

장치 툴바를 사용하여 네트워크 토폴로지를 구성한다. 만약 필요한 장치가 없을 경우, 추가로 설치하여 사용할 수 있다.

(본 프로젝트에 사용된 장치 : (Router) IOSv156-2.T-2 / c3725, (Switch) IOSvL2 / Ethernet switch)

 

각 장치의 이름을 쉽게 이해할 수 있도록 변경한다.

 

 

이제 모든 장치를 실행하고, 각 장치에 대한 콘솔 창을 실행한다.

 

- NetworkAutomation 장치 설정

 NetworkAutomation 콘솔에서 다음 명령어를 입력하여 내용을 수정한 후, NetworkAutomation 장치를 종료하고 다시 시작한다. (NetworkAutomation을 오른쪽 클릭하여 Stop을 선택한 다음, Start를 클릭한다.)

nano /etc/network/interfaces

 


<변경 전>
<변경 후>

<변경 후>

<변경 전 ifconfig 결과>

<변경 및 재부팅 후 ifconfig 결과>
  • auto eth0 : 시스템이 부팅될 때 eth0 네트워크 인터페이스를 자동으로 활성하도록 설정한다.
  • iface eth0 inet dhcp : eth0 인터페이스가 DHCP를 통해 IP 주소를 자동으로 할당받도록 설정한다.

- 라우터 장치 설정

 각 라우터의 콘솔에서 다음 명령어를 입력한다. 단, 각 라우터의 IP 주소는 다음과 같다.

conf t
hostname R2
int g0/0
no sh
ip add 192.168.122.53 255.255.255.0
  • conf t(configure terminal) : 라우터의 글로벌 설정 모드로 진입하는 명령어이다. 이를 통해 라우터의 설정을 변경할 수 있다.
  • hostname R2 : 라우터 이름을 R2로 설정한다. hostname은 네트워크 장치의 식별자를 설정하는 명령어로, 이 이름은 라우터의 프롬프트에 표시되어 구분할 수 있도록 한다.
  • int g0/0(interface gigabitEthernet 0/0) : 라우터의 기가비트 이더넷 0/0 인터페이스의 설정 모드로 진입하는 명령어이다. 라우터의 각 인터페이스는 별도로 설정할 수 있다.
  • no sh(no shutdown) : 선택한 인터페이스를 활성화하는 명령어이다. 기본적으로 라우터의 인터페이스는 비활성화(shudown) 상태로 설정되기 때문에, 이를 활성화하기 위해 사용한다.
  • ip add 192.168.122.53 255.255.255.0(ip address 192.168.122.53 255.255.255.0) : gigabitEthernet 0/0 인터페이스에 IP 주소 192.168.122.53과 서브넷 마스크 255.255.255.0을 할당하는 명령어이다. 이 설정을 통해 해당 인터페이스가 설정한 IP 주소로 통신할 수 있게 한다.
장치 IPv4 주소 서브넷 마스크
R1 192.168.122.53 255.255.255.0
R2 192.168.122.51 255.255.255.0
R3 192.168.122.52 255.255.255.0

 

- 스위치 설정

각 스위치의 콘솔에서 다음 명령어를 입력한다. 단, 각 스위치의 IP 주소는 다음과 같다.

en
conf t
hostname SW1
int g0/0
no sw
no sh
ip add 192.168.122.61 255.255.255.0
  • en(enable) : 사용자 모드에서 privileged EXEC 모드로 진입하는 명령어이다. 이 모드는 장치 설정을 확인하고, 글로벌 설정 모드 등으로 진입할 수 있도록 한다.
  • no sw(no switchport) : 스위치 포트를 L3(Layer 3) 모드로 전환하는 명령어이다. 기본적으로 스위치의 포트는 L2(Layer 2) 모드로 동작하는데, no switchport 명령어를 통해 해당 포트를 L3 포트로 전환할 수 있다. 즉, IP 주소를 설정할 수 있는 라우팅 포트로 동작한다.
장치 IPv4주소 서브넷 마스크
SW1 192.168.122.61 255.255.255.0
SW2 192.168.122.62 255.255.255.0

 

- Ansible 설정

Ansible은 네트워크 장치와의 통신 및 자동화를 수행하기 위해 설정해야 한다. NetworkAutomation 콘솔에서 다음 명령을 입력하여 아래 내용을 추가한다.

nano ansible.cfg
[defaults]
inventory = ./myhosts
host_key_checking = false
timeout = 15
deprecation_warnings = False
  • [defaults] : Ansible에서 기본 설정값을 지정하는 섹션이다. 여기서 설정된 옵션들은 Ansible 실행 시 기본적으로 적용된다.
  • inventory = ./myhosts : Ansible이 관리할 Host(라우터, 스위치 등)의 목록을 지정하는 파일의 경로를 설정한다. ./myhosts 파일에 네트워크 장치의 IP 주소와 호스트 정보가 저장될 것이다. Ansible은 이 인벤토리 파일을 참고하여 관리 대상 장치에 작업을 실행한다.
  • host_key_checking = false : 원격 장치와의 초기 연결 시 SSH 키 확인을 하지 않도록 설정한다. 라우터, 스위치 등과 SSH로 연결할 때, Ansible은 기본적으로 해당 장치의 SSH 키를 확인한다. 그러나, host_key_checking을 false로 설정하면 키 확인 과정을 생략하여 연결이 원활하게 이루어진다. 네트워크 자동화에서는 이 과정이 불필요한 경우가 많아, 연결을 간편하게 하기 위해 옵션을 비활성화하는 경우가 많다.
  • timeout = 15 : Ansible이 원격 호스트에 연결을 시도할 때 기다리는 시간을 설정한다. 네트워크 환경에서 일부 장치에 대한응답 시간이 길 수 있으므로, 15초로 시간을 설정하여 연결이 안정적으로 이루어지도록 한다. 너무 짧은 시간은 네트워크 지연 때문에 연결 실패를 초래할 수 있어 적절한 시간 설정이 필요하다.
  • deprecation_warnings = False : Ansible에서 사용 중지된 기능과 관련된 경고 메시지를 표시하지 않도록 설정한다. 최신 버전으로 인해 발생할 수 있는 불필요한 경고 메시지를 생략하여, 작업 중 출력되는 로그를 간결하게 유지하려는 목적이다. 특히, 과거의 Ansible 버전에서 지원했던 기능이 최신 버전에서 사용 중지(deprecated)되었을 경우, 해당 경고 메시지가 출력되지 않도록 한다.

Ansible에서 관리할 네트워크 장치의 목록을 정의하는 인벤토리 파일(./myhosts)을 작성한다. 다음 명령어를 NetworkAutomation 콘솔에서 실행한다.

nano myhosts
[routers]
R1
R2
R3

[switches]
SW1
SW2
  • [routers] : Ansible 인벤토리에서 라우터 그룹을 정의하는 섹션이다.
  • [switches] : Ansible 인벤토리에서 스위치 그룹을 정의하는 섹션이다.
 
도메인 이름을 IP 주소와 연결하기 위해 NetworkAutomation 콘솔에서 명령어를 실행한다.
nano /etc/hosts
192.168.122.51 R1
192.168.122.52 R2
192.168.122.53 R3
192.168.122.61 SW1
192.168.122.61 SW2
  • 192.168.122.51 R1 : R1이라는 호스트 이름을 192.168.122.51 IP 주소와 연결한다.

이후, cat ansible.cfg, cat myhosts, cat /etc/hosts 명령어를 이용하여 잘 작성되었는지 확인한다. 또한, 다음 명령어를 이용하여 Ansible을 사용하여 인벤토리에 있는 호스트 목록을 확인한다.

ansible --list-hosts all
  • ansible --list-hosts all : Ansible 인벤토리에 등록된 모든 호스트를 출력한다.
ansible --list-hosts routers
  • ansible --list-hosts routers : Ansible 인벤토리 내에서 routers 그룹에 속한 라우터 목록을 출력한다.
ansible --list-hosts switches
  • ansible --list-hosts switches : Ansible 인벤토리 내에서 switches 그룹에 속한 스위치 목록을 출력한다.

 

- 각 라우터 및 스위치에 보안 설정 및 원격 접속을 위한 SSH 설정

현재 각 라우터 및 스위치 장치는 원격 접속이 불가능하다. 따라서, 다음 명령어를 각 장치마다 입력한다.

usern cisco pas cisco
usern cisco priv 15
lin vty 0 4
tr i a
logi loc
exi
ip domain-n netautomation.com

cry key gen rsa
1024
  • usern cisco pas cisco : usern은 username의 축약 명령어이며, 사용자 계정 cisco를 생성하고, 비밀번호(pas, password)를 cisco로 설정한다.
  • usern cisco priv 15 : cisco 사용자의 권한을 15로 설정한다(권한 최고 레벨은 15이다)
  • lin vty 0 4 : 가상 텔레타입라인(VTY) 0~4번을 설정한다. VTY는 원격 접속을 위한 논리적 터미널로, 5개의 세션을 허용한다.
  • tr i a : transport input all의 축양 명령어로, 모든 입력 방식(ex. SSH, Telnet)을 허용한다.
  • logi loc : login local의 축약 명령어로, 로컬 사용자 데이터베이스를 사용하여 로그인할 수 있도록 설정한다.
  • exi : eixt의 축양 명령어로, 현재 설정 모드에서 나간다.
  • ip domain-n netautomation.com : 도메인 이름을 netautomation.com으로 설정한다. 이는 SSH 키 생성 시 필수적인 도메인 이름 설정을 수행하기 위한 것으로, 네트워크 장치의 식별을 돕고, SSH 키 생성 시 장치의 이름으로 사용된다.
  • cry key gen rsa : cry는 crypto의 축약이고, key gen rsa는 RSA 방식의 공개/비공개 키 쌍을 생성한다. 이는 SSH를 사용할 때, RSA 암호화 키가 필요함에 따라 보안을 위해 SSH를 사용할 수 있도록 암호화 키를 생성하는 과정이다.
  • 1024 : 생성되는 RSA 키의 길이를 1024비트로 지정한다.

- NetworkAutomation에서 SSH를 이용한 접속

Ansible을 사용하여 특정 장치에 SSH를 통한 접속은 다음 명령어와 같다.

ansible R2 -m raw -a "show version" -u cisco -k
  • ansible : Ansible 명령어를 실행하기 위한 기본 명령어이다.
  • R2 : Ansible inventory에서 정의된 호스트의 이름이다.
  • -m raw : -m 플래그는 사용할 모듈을 지정하며, raw 모듈은 Ansible의 기본 모듈 중 하나로, 원시 명령어를 실행할 때 사용된다. 이 모듈은 SSH 세션을 열고, 원시 명령어를 직접 실행한다.
  • -a "show version" : -a 플래그는 실행할 명령어를 지정한다. 여기서는 Cisco 장치의 현재 버전 정보를 출력하는 'show version' 명령어를 실행한다.
  • -u cisco : -u 플래그는 SSH 접속 시 사용할 사용자의 이름을 지정한다. 여기서는 cisco라는 사용자 이름으로 로그인한다.
  • -k : 이 플래그는 비밀번호 입력을 요청하는 옵션이다. Ansible이 SSH로 장치에 접근할 때 비밀번호를 입력해야 하며, 이 옵션을 추가하면 비밀번호를 입력하라는 프롬프트가 나타난다.

Error 해결 방법 :
   apt update
   apt install sshpass

 

 

 현재까지는 Ansible을 활용한 기초적인 내용을 다루었다. 앞으로의 내용에서는 네트워크 정보를 수집하는 방법에 대해 알아볼 것이다. 이를 통해 Ansible을 사용하여 네트워크 장치 및 시스템의 상태를 모니터링하고, 필요한 정보를 효율적으로 수집하는 기법을 다룰 예정이다. 네트워크 정보 수집은 시스템 관리 및 운영의 핵심 요소로, 적절한 데이터를 확보함으로써 신속한 문제 해결과 시스템 최적화를 도모할 수 있다.

728x90

'Network 심화 > GNS3-Ansible' 카테고리의 다른 글

GNS3에서 Ansible Playbook 사용하기(1)  (6) 2024.11.03
GNS3와 Ansible을 이용한 네트워크 구성(2)  (2) 2024.10.23
GNS3 IOSv(IOS Virtual)  (16) 2024.10.21
GNS3 VM 개념 및 설치  (3) 2024.10.20
GNS3 개념 및 GUI 설치  (7) 2024.10.20