[네트워크 자동화 Ep.2] 인벤토리 설계와 첫 데이터 수집 — 그 결과는 어떤 원리로 나오는가

📡 [네트워크 자동화 Ep.2] 인벤토리 설계와 첫 데이터 수집 — 그 결과는 어떤 원리로 나오는가

facts와 ios_command의 차이, 그리고 “Ansible은 결국 SSH로 명령을 친다”는 본질의 이해

#인벤토리 #ios_facts #ios_command #cliconf #NETCONF #멘탈모델

📋 이 글의 흐름

  • 1. 14대를 전체로 확장하기 (–limit 떼기)
  • 2. 그 결과는 어떤 원리로 출력됐나 — SSH의 실체
  • 3. facts vs ios_command — 두 수집 방식의 차이
  • 4. cliconf vs NETCONF — 데이터를 받는 두 철학
  • 5. 핵심 멘탈 모델 한 줄

Ep.1에서 한 대 접속에 성공했다. 이제 전체로 확장하고, 더 중요한 질문에 답한다 — “이 결과는 대체 어떤 원리로 나온 건가?” 이 원리를 이해하면 Ansible이 마법에서 구조로 바뀐다.

1. 14대를 전체로 확장하기

--limit 옵션을 떼면 인벤토리의 14대 전체에 동시 실행된다. 1대로 길을 검증했으니 이제 전체로 간다.

Ubuntu Shell — 14대 전체
–limit 제거. switches 그룹 전원에게 facts 수집을 실행한다.
ansible -i inventory.yml switches \
  -m cisco.ios.ios_facts \
  -e 'sw_user=admin sw_pass=P@ssw0rd!2030 sw_enable=En@bleKey'

14대가 주르륵 SUCCESS로 뜨면 “1대 → 14대”가 입증된 것이다. 일부가 실패하면 그것도 정보다 — 어느 장비가 접속 안 되는지, 계정이 다른지가 즉시 드러난다. 이 가시성은 수동 점검으로는 얻기 어렵다.

2. 그 결과는 어떤 원리로 출력됐나 — SSH의 실체

가장 중요한 이해다. 결론부터: Ansible은 별도의 마법 채널이 아니라, 당신이 손으로 show version을 칠 때 쓰던 그 SSH 접속을 자동으로 대신 한 것이다. 실제로 일어난 일을 순서대로 풀면:

인벤토리에서 대상 확정 (10.20.0.57, 포트 2002, 계정 admin)
pylibssh가 실제 SSH 접속 — 손으로 ssh 치는 것과 동일
become 설정대로 enable 모드 진입
모듈이 장비에 실제 show 명령을 타이핑해서 전송
장비가 뱉은 지저분한 텍스트를 파서로 정리
SSH 종료 + 깔끔한 결과(JSON) 출력

즉, 당신이 본 그 깔끔한 결과는 원래 길고 지저분했던 show version 텍스트를 모듈이 받아서 가공한 것이다. 새로운 통신 프로토콜이 아니라, SSH로 명령 치고 → 받은 텍스트를 파싱한 결과다.

🧭 사람으로 치환하면

“SSH로 접속 → enable 입력 → show version 입력 → 나온 화면 복사 → 모델·버전·시리얼만 골라 정리 → 접속 종료”. 사람이 하면 1~2분, 모듈이 하면 1초. 14대면 사람은 14번 반복, 모듈은 동시에. 이것이 자동화의 정체다 — 당신이 하던 행위를 코드가 똑같이, 단 빠르고 반복적으로.

💡 정말 SSH로 명령을 치는지 두 눈으로 확인하기

명령 끝에 -vvvv(verbose)를 붙이면 Ansible이 SSH로 주고받은 모든 과정이 그대로 출력된다. “아, 진짜 명령을 타이핑하는구나”를 직접 확인할 수 있다.

3. facts vs ios_command — 두 수집 방식

여기서 중요한 분기가 있다. ios_facts는 모델·버전·시리얼처럼 Ansible이 미리 파싱해주는 정형 정보만 준다. 하지만 CPU·온도·전원처럼 그 밖의 정보는 ios_command직접 show 명령을 쳐서 raw 출력을 받아야 한다.

구분ios_factsios_command
성격미리 정의된 정형 정보임의의 show 명령 raw 출력
결과 형태깔끔한 키-값(JSON)명령 출력 그대로(텍스트)
파싱자동직접 해야 함
용도모델·버전·인터페이스CPU·메모리·온도·로그 등 전부
ios_command 예시 — 임의 명령 실행
facts에 없는 정보는 이렇게 직접 명령을 보내 받는다.
- name: 점검 명령 실행
  cisco.ios.ios_command:
    commands:
      - show clock                 # 현재 시각
      - show processes cpu | include CPU   # CPU 사용률
      - show environment all       # 온도/팬/전원
  register: result                 # 결과를 result 변수에 저장

4. cliconf vs NETCONF — 데이터를 받는 두 철학

facts 결과에 "ansible_net_api": "cliconf"라고 찍혀 있었다. 이건 “CLI로 명령을 치고 텍스트를 받는다”는 뜻이다. 구형 Cisco는 이 방식이 유일하다. 하지만 현대 장비는 다른 길도 있다.

방식CLI (cliconf)API (NETCONF/RESTCONF)
데이터사람이 보던 화면을 기계가 해석구조화된 데이터를 직접 주고받음
안정성출력 형식 바뀌면 파서가 깨짐형식이 정의돼 있어 견고
대상구형 포함 거의 모든 장비비교적 현대 장비
💡 미래 방향 — CLI 파싱의 근본적 취약점

CLI 파싱은 “사람이 보던 화면을 기계가 억지로 해석”하는 방식이라 깨지기 쉽다. 장비가 출력 형식을 살짝만 바꿔도 파서가 틀어진다. 그래서 업계는 NETCONF/RESTCONF 같은 API 기반(구조화 데이터)으로 이동 중이다. 구형 장비는 CLI뿐이지만, 차세대 장비를 들일 땐 “이 장비가 NETCONF를 지원하나”가 중요한 선택 기준이 된다.

5. 핵심 멘탈 모델 한 줄

🧠 이것만 기억하면 수백 개 모듈이 설명된다

“Ansible 네트워크 모듈 = SSH 접속 + 명령 전송 + 출력 파싱의 자동화”

이 모델 하나면, 앞으로 만날 어떤 모듈도 “이건 SSH 접속 단계냐, 명령 전송 단계냐, 파싱 단계냐”로 분해해서 볼 수 있다. 에러가 나도 어느 단계에서 막혔는지 즉시 좁혀진다. 낱개로 외울 필요가 없어진다.