일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- rommon mode
- 연결선 수
- 티스토리챌린지
- centos
- junos os
- gns3
- STP
- vlan
- BPDU
- port aggregation protocol
- Network Design
- Cisco
- SQL
- 오블완
- Ansible
- 프로그래머스
- 네트워크
- 방화벽
- 네트워크 설계
- eigrp
- 하프오픈
- LACP
- pvst+
- 네이티브 vlan
- ospf
- stream 9
- Red Hat
- freeradius
- pagp
- Packet Tracer
- Today
- Total
Doctor Pepper
GNS3에서 Ansible Playbook 사용하기(1) 본문
이번 블로그 포스팅에서는 Ansible Playbook을 사용하여 네트워크 장비를 자동화하는 방법을 알아보려고 합니다.
ps. 최근 알바를 하다 손을 다쳐 포스팅이 늦어졌습니다.
1. Ansible Playbook
Ansible은 IT 자동화 도구로, 서버 설정, 어플리케이션 배포, 네트워크 장비 설정 등을 자동화하는 데에 사용된다. Ansible Playbook은 이러한 작업을 코드화하여 사람이 이해할 수 있는 YAML 형식으로 작성된 스크립트이다. 각 Playbook은 특정한 목적을 가지고 있으며, 여러 개의 태스크(task)를 순차적으로 실행한다. 이를 통해 시스템 간 일관된 구성과 설정을 쉽게 적용할 수 있다.
Ansible Playbook은 GNS3와 같은 네트워크 시뮬레이션 환경에서 네트워크 장비들을 프로그래밍적으로 제어하고 관리하는 데 유용하다. 이를 통해 네트워크 엔지니어들이 반복적인 작업을 줄이고, 더욱 효율적으로 네트워크 환경을 구성하고 테스트할 수 있다.
에이전트리스 (Agentless) |
Ansible은 원격 시스템에 별도의 소프트웨어를 설치할 필요가 없음. SSH 연결을 통해 명령을 전송하고 실행하므로 에이전트리스(Agentless) 방식으로 작동함. |
YAML 기반 구성 | Playbook은 YAML 형식으로 작성되어 있어 가독성이 높고, 복잡한 작업도 간단하게 표현할 수 있음. |
Idempotency | 동일한 Playbook을 여러 번 실행하더라도 시스템 상태가 중복되지 않으며, 원하는 결과를 안정적으로 유지할 수 있음. |
모듈화 | Ansible은 다양한 모듈을 통해 여러 시스템과 어플리케이션을 관리할 수 있음. 네트워크 장비 관리 모듈도 제공되어, 다양한 벤더의 장비를 통합 관리할 수 있음. |
플러그인 지원 | 커넥션, 캐시, 콜백 등의 플러그인 시스템을 통해 유연하게 확장할 수 있음. |
2. 토폴로지 구성
GNS3를 실행하고 다음과 같이 네트워크 토폴로지를 구성한다.
- NetworkAutomation 장치 설정
nano /etc/network/interfaces |
- 스위치 설정
각 스위치에 따라 다음 명령어를 실행한다.
SW1 | en conf t hostname SW1 int vl1 no sh ip add 192.168.122.61 255.255.255.0 |
SW2 | en conf t hostname SW2 int vl1 no sh ip add 192.168.122.62 255.255.255.0 |
SW3 | en conf t hostname SW2 int vl1 no sh ip add 192.168.122.63 255.255.255.0 |
SW4 | en conf t hostname SW2 int vl1 no sh ip add 192.168.122.64 255.255.255.0 |
SW5 | en conf t hostname SW2 int vl1 no sh ip add 192.168.122.65 255.255.255.0 |
SW1~5 공통 |
usern cisco pas cisco usern cisco priv 15 lin vty 0 4 tr i a logi loc exi ip domain-n netautomation.com |
3. Ansible 설정
- ansible.cfg 설정
nano ansible.cfg |
[defaults] inventory = ./myhosts host_key_checking = false timeout = 15 deprecation_warnings = False |
- /etc/hosts 설정
nano /etc/hosts |
192.168.122.61 SW1 192.168.122.62 SW2 192.168.122.63 SW3 192.168.122.64 SW4 192.168.122.65 SW5 |
- myhosts 설정
nano myhosts |
[agg] SW1 SW2 [access] SW3 SW4 SW5 |
4. 테스트
NetworkAutomation 장치에서 각 스위치별 ping 테스트를 수행한다(192.168.122.xx에서 xx는 IP 주소를 입력한다).
ping 192.168.122.xx |
각 스위치에 다음 명령어를 통해 연결된 정보를 확인할 수 있다.
sh arp |
- sh arp : show arp의 약어로, 스위치 또는 라우터의 ARP 테이블을 보여주는 명령어이다.
sh cdp n |
- sh cdp n : show cdp neighbors 명령어의 약어로, Cisco 장비에서 CDP(Cisco Discovery Protocol)를 사용하여 이웃 장비 정보를 확인하는 데 사용된다.
5. Ansible Playbook
- getarp.yml : 네트워크 장비에서 ARP 테이블 정보를 가져올 수 있다.
--- - name: Get ARP info hosts: all gather_facts: false tasks: - name: show arp raw: "show arp" register: print_output - debug: var=print_output.stdout_lines |
- - name: Get ARP info : Playbook의 이름을 Get ARP info로 지정한다.
- hosts : all : Playbook을 실행할 호스트 그룹을 지정하며, 여기서 all은 모든 대상 호스트에 대해 Playbook을 실행하도록 설정한다.
- gather_facts: false : Ansible이 호스트 정보를 자동으로 수잡할지 여부를 결정하는 옵션으로, 네트워크 자동화를 위해 대부분 false로 설정하여 호스트 정보 수집을 생략한다.
- tasks 블록 : 수행할 작업 목록을 정의한다.
- name: show arp : 작업의 이름을 show arp로 지정한다.
- raw: "show arp" : show arp 명령어를 실행하는 모듈로, 대상 호스트에 SSH를 통해 원시 명령어를 전송하므로 네트워크 장비에 직접 CLI 명령어를 실행할 때 사용된다.
- register: print_output : 명령어의 결과를 print_output 변수에 저장한다.
- debug: var=print_output.stdout_lines : 첫 번째 작업에서 저장한 명령어 출력 결과를 디버그 모듈을 사용하여 화면에 출력한다.
- print_output.stdout_lines : show arp 명령어의 출력 결과가 줄 단위로 저장된 리스트 형식으로 출력되도록 설정된 부분이다.
ansible-playbook getarp.yml -u cisco -k |
ansible-playbook getarp.yml -u cisco -k | grep 'ok:\|8001' |
※ 8001은 MAC Address이다.
ansible-playbook getarp.yml -u cisco -k | grep 'ok:\|122\.27' |
※ 122\.27은 IP Address이다.
- getmac.yml : 네트워크 장비에서 MAC 테이블 정보를 가져올 수 있다.
--- - name: Get MAC info hosts: all gather_facts: false tasks: - name: show MAC table raw: "show mac address-table" register: print_output - debug : var=print_output.stdout_lines |
ansible-playbook getmac.yml -u cisco -k |
ansible-playbook getmac.yml -u cisco -k | grep 'ok:\|8001' |
- multiplecommands.yml : 여러 명령어를 실행하여 그 결과를 확인할 수 있다.
--- - name: ios command multiple commands hosts: all gather_facts: false connection: local tasks: - name: run multiple commands ios_command: commands: - show vlan brief - show ip int brief register: print_output - debug: var=print_output.stdout_lines |
- tasks 블록 : 수행할 작업 목록을 정의한다.
- name: run multiple commands : 작업 이름을 정의하다.
- ios_command : Ansible의 ios_command 모듈을 사용해 Cisco IOS 장비에서 명령어를 실행한다.
- commands: 여러 명령어를 리스트 형태로 지정한다. show vlan brief 명령어를 사용하여 VLAN 정보를 요약하여 출력하고, show ip in brief 명령어를 통해 인터페이스의 IP 주소와 상태 정보를 요약하여 출력한다.
- outputint.yml : 인터페이스 구성 정보를 가져와 파일로 저장할 수 있다.
--- - name: Save interfaces config hosts: all gather_facts: false connection: local tasks: - name: run multiple commands ios_command: commands: - show ip int brief register: print_output - debug: var=print_output.stdout_lines - name: save output to a file copy: content="{{print_output.stdout[0]}}" dest="./interfaces/{{inventory_hostname}}.txt" |
- copy : Ansible의 copy 모듈을 사용해 출력 결과를 파일로 저장한다.
- content="{{print_output.stdout[0]}}" : show ip int brief 명령어의 결과를 파일에 저장할 내용으로 지정한다.
- dest="./interfaces/{{inventory_hostname}}.txt" : 출력 결과를 저장할 파일 경로를 지정한다. {{inventory_hostname}}은 현재 호스트의 이름으로, 각 장비에 대한 파일이 생성되도록 한다.
ansible-playbook outputint.yml -u cisco -k |
※ 단, 실행을 위해 interfaces 디렉토리를 생성해야 한다.
- shrun.yml : 실행 중 장치의 구성(running configuration)을 가져와 파일로 저장할 수 있다.
--- - name: Store Running Configs hosts: all gather_facts: false connection: local tasks: - name: run enable level commands ios_command: authorize: yes commands: - show run register: print_output - debug: var=print_output.stdout_lines - name: save output to a file copy : content="{{ print_output.stdout[0] }}" dest="./runningconfigs/{{ inventory_hostname }}.txt" |
- authorize: yes : enable 모드로 실행하도록 설정한다.
ansible-playbook shrun.yml -u cisco -k |
- ospfvlan.yml : 모든 장비에 OSPF 라우팅 프로토콜을 설정하고, 특정 호스트 그룹에 VLAN을 설정할 수 있다.
--- - name: Configure OSPF on ALL hosts: all gather_facts: false connection: local vars: cli: username: cisco password: cisco tasks: - name: enable ospf ios_config: provider: "{{ cli }}" authorize: yes parents: router ospf 1 lines: - network 0.0.0.0 255.255.255.255 area 0 register: print_output - debug: var=print_output - name: Configure Access VLANs hosts: access gather_facts: false connection: local vars: cli: username: cisco password: cisco tasks: - name: Create VLANs ios_config: provider: "{{ cli }}" authorize: yes lines: - vlan 10 - vlan 20 - vlan 30 - vlan 40 register: print_output - debug: var=print_output |
- provider: "{{ cli }}" : cli 변수에 저장된 인증 정보를 사용하여 장비에 연결한다.
- parents: router ospf 1 : OSPF 프로세스 ID 1을 지정하여 OSPF 설정의 상위 구성 단계로 접근한다.
- lines : OSPF 라우팅에 필요한 IP주소를 설정하여, 모든 네트워크가 OSPF area 0에 포함되도록 한다. 그리고, 네트워크 스위치에 vlan 10/20/30/40을 생성한다.
ansible-playbook ospfvlan.yml -u cisco -k |
이와 같이 Ansible과 GNS3를 활용하면 네트워크 장비 설정 및 관리가 효율적으로 이루어 질 수 있습니다.
'Network 심화 > GNS3-Ansible' 카테고리의 다른 글
GNS3에서 Ansible Playbook 사용하기(2) (2) | 2024.11.03 |
---|---|
GNS3와 Ansible을 이용한 네트워크 구성(2) (2) | 2024.10.23 |
GNS3와 Ansible을 이용한 네트워크 구성(1) (5) | 2024.10.22 |
GNS3 IOSv(IOS Virtual) (16) | 2024.10.21 |
GNS3 VM 개념 및 설치 (3) | 2024.10.20 |