일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- centos
- LACP
- Ansible
- Network Design
- 프로그래머스
- 하프오픈
- 방화벽
- Red Hat
- 네트워크 설계
- 네이티브 vlan
- stream 9
- rommon mode
- gns3
- junos os
- 네트워크
- STP
- pvst+
- BPDU
- 티스토리챌린지
- Packet Tracer
- freeradius
- 연결선 수
- ospf
- Cisco
- vlan
- pagp
- eigrp
- 오블완
- SQL
- port aggregation protocol
- Today
- Total
Doctor Pepper
GNS3와 Ansible을 이용한 네트워크 구성(1) 본문
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 인벤토리에서 스위치 그룹을 정의하는 섹션이다.
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을 사용하여 네트워크 장치 및 시스템의 상태를 모니터링하고, 필요한 정보를 효율적으로 수집하는 기법을 다룰 예정이다. 네트워크 정보 수집은 시스템 관리 및 운영의 핵심 요소로, 적절한 데이터를 확보함으로써 신속한 문제 해결과 시스템 최적화를 도모할 수 있다.
'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 |