RHEL 9 폐쇄망 Ansible 구축 가이드





RHEL 9 폐쇄망 Ansible 구축
IOS/NXOS Integration & Script Automation

📌 Executive Summary

  • Zero-Base: Root 권한으로 계정 생성부터 시작하는 End-to-End 가이드.
  • Bootstrap: Pip가 없는 서버에서 Python으로 강제 설치하는 비기(秘技).
  • Precision: RHEL 9 (GLIBC 2.34) 호환성 검증 파일명 리스트 완비.
  • Automation: IOS & NXOS 통합 및 실행 스크립트(.sh) 완비.

PHASE 0. 기반 공사 (Root 작업)

서버 초기 상태에는 netops 계정이 없습니다. 관리자(Root)가 딱 한 번 수행합니다.

# 1. netops 계정 생성 및 비밀번호 설정
useradd netops
passwd netops

# 2. 작업용 디렉토리 생성 (/var/log/netops)
mkdir -p /var/log/netops

# 3. 소유권 이전 (이후 모든 작업은 netops가 수행)
chown -R netops:netops /var/log/netops
chmod 755 /var/log/netops

PHASE 1. [PC] 설치 파일 “핀셋” 다운로드

PyPI 사이트의 ‘Download files’ 탭에서 아래 파일명과 정확히 일치하는 파일을 찾아야 합니다.

1-1. Pip 부트스트랩 (서버 인공호흡용)

서버에 pip를 살려내기 위한 3대장입니다. 반드시 Wheel (.whl) 파일을 받으세요.

패키지 필수 파일명 패턴 설치 이유 (Why?) 다운로드
pip pip-24.x.x-py3-none-any.whl 설치 도구 본체서버에 pip 명령어가 없으므로 필수 PyPI Link
setuptools setuptools-69.x.x-py3-none-any.whl 빌드 도구Pip 설치 및 실행 시 필요한 라이브러리 PyPI Link
wheel wheel-0.42.x-py3-none-any.whl 패키징 도구Whl 포맷 파일을 다루기 위해 필요 PyPI Link

1-2. Ansible Core 및 의존성 (GLIBC 2.34 호환)

파일명 중간에 cp311(파이썬 3.11)과 manylinux_2_28_x86_64가 반드시 있어야 합니다.

패키지 찾아야 할 정확한 파일명 (붉은 글씨 확인 필수) 설치 이유 (Why?) 다운로드
ansible-core ansible_core-2.16.x-py3-none-any.whl 앤서블 엔진자동화 시스템의 두뇌 Link
cryptography cryptography-41.x…manylinux_2_28_x86_64.whl 암호화 코어SSH 통신 및 Vault 암호화에 필수 Link
cffi cffi-1.16.x-cp311…manylinux_2_28_x86_64.whl C 언어 인터페이스암호화 라이브러리가 C 코드를 호출함 Link
bcrypt bcrypt-4.1.x-cp311…manylinux_2_28_x86_64.whl SSH 키 교환최신 SSH 보안 알고리즘 지원 Link
PyNaCl PyNaCl-1.5.x-cp311…manylinux_2_28_x86_64.whl SSH 보안 강화Ed25519 등 최신 키 방식 지원 Link
paramiko paramiko-3.4.x-py3-none-any.whl Cisco 접속 모듈네트워크 장비 CLI 접속용 클라이언트 Link
Jinja2 Jinja2-3.1.x-py3-none-any.whl 템플릿 엔진Playbook의 변수({{ var }}) 치환 Link
MarkupSafe MarkupSafe-2.1.x…manylinux_2_28_x86_64.whl Jinja2 가속기템플릿 처리 속도 향상 (C컴파일) Link
PyYAML PyYAML-6.0.x…manylinux_2_28_x86_64.whl YAML 파서.yml 설정 파일을 읽기 위해 필요 Link
resolvelib resolvelib-1.0.x-py3-none-any.whl 의존성 해결사패키지 간 버전 충돌 방지 Link
packaging packaging-23.x-py3-none-any.whl 버전 체크 도구설치 시 라이브러리 버전 확인 Link
pycparser pycparser-2.21-py2.py3-none-any.whl C 코드 파서CFFI가 사용하는 보조 도구 Link

1-3. 컬렉션 “Golden Key” (IOS + NXOS 통합)

⛔ CRITICAL WARNING:
Galaxy 웹사이트에서 tar.gz를 받으면 플러그인이 누락됩니다. PC 터미널에서 설치 후 “생성된 폴더”를 가져가야 합니다.
# 1. PC 터미널에서 임시 설치 (IOS, NXOS 포함)
ansible-galaxy collection install cisco.ios cisco.nxos ansible.netcommon -p ./pkg_temp

# 2. 검증 (terminal 폴더 확인 - 필수)
ls pkg_temp/ansible_collections/cisco/ios/plugins/terminal/ios.py
ls pkg_temp/ansible_collections/cisco/nxos/plugins/terminal/nxos.py

# 3. 폴더 압축 (서버로 가져갈 Golden Key)
tar -czvf offline_collections.tar.gz -C pkg_temp ansible_collections

PHASE 2. [서버] Pip 부트스트랩 (수동 설치)

작업 위치: /var/log/netops/pkg (파일 업로드 위치)

2-1. Pip 강제 설치 (Bootstrap)

서버에 pip가 없으므로 파이썬으로 직접 실행하여 설치합니다.

cd /var/log/netops/pkg

# 파이썬(python3.11)이 압축파일(pip.whl) 내의 pip 모듈을 실행하여
# 나 자신을 내 계정(--user)에 설치한다.
python3.11 pip-*.whl/pip install --user --no-index --find-links=. pip setuptools wheel

# 설치 확인 (이제 pip3.11 명령어가 생겼습니다)
/home/netops/.local/bin/pip3.11 --version

2-2. Ansible 및 의존성 설치

# 나머지 파일 일괄 설치
/home/netops/.local/bin/pip3.11 install --user --no-index --find-links=. ansible-core paramiko

2-3. 컬렉션 이식

# 앤서블이 인식하는 표준 경로 생성
mkdir -p /home/netops/.ansible/collections

# 가져온 Golden Key 압축 해제
tar -xzvf offline_collections.tar.gz -C /home/netops/.ansible/collections/

PHASE 3. 설정 및 파일 생성 (IOS/NXOS 대응)

작업 위치: /var/log/netops

3-1. ansible.cfg

ansible.cfg
[defaults]
inventory = /var/log/netops/hosts.ini
# [핵심] 컬렉션 경로 강제 지정
collections_path = /home/netops/.ansible/collections
# [핵심] 파이썬 인터프리터 고정
interpreter_python = /usr/bin/python3.11
host_key_checking = False
log_path = /var/log/netops/ansible.log
retry_files_enabled = False

3-2. hosts.ini (OS별 그룹 분리)

hosts.ini
[ios_switches]
192.168.10.1
192.168.10.2

[ios_switches:vars]
ansible_network_os=cisco.ios.ios
ansible_connection=network_cli

[nxos_switches]
10.2.2.1

[nxos_switches:vars]
ansible_network_os=cisco.nxos.nxos
ansible_connection=network_cli

3-3. secrets.yml (Vault)

# 1. 키 파일 생성
echo "MyVaultKey" > /var/log/netops/.vault_pass
chmod 600 /var/log/netops/.vault_pass

# 2. 암호화 파일 생성
ansible-vault create /var/log/netops/secrets.yml --vault-password-file /var/log/netops/.vault_pass
secrets.yml (입력 내용)
vault_ssh_password: "RealSwitchPassword!"
vault_enable_password: "RealEnablePassword!"

3-4. backup.yml (통합 플레이북)

backup.yml
---
- name: Network Backup (IOS & NXOS)
  hosts: all
  gather_facts: no
  vars_files:
    - /var/log/netops/secrets.yml
  vars:
    ansible_user: admin
    ansible_password: "{{ vault_ssh_password }}"
    ansible_become: yes
    ansible_become_method: enable
    ansible_become_password: "{{ vault_enable_password }}"
    ansible_command_timeout: 60

  tasks:
    - name: Get Date
      setup:
        filter: "ansible_date_time"
      delegate_to: localhost
      run_once: true

    - name: Create Directory
      ansible.builtin.file:
        path: "/var/log/netops/backups/{{ ansible_date_time.date }}"
        state: directory
      delegate_to: localhost
      run_once: true

    # --- [IOS 백업] ---
    - name: Backup IOS Config
      cisco.ios.ios_command:
        commands: show running-config
      register: ios_config
      when: ansible_network_os == 'cisco.ios.ios'

    # --- [NXOS 백업] ---
    - name: Backup NXOS Config
      cisco.nxos.nxos_command:
        commands: show running-config
      register: nxos_config
      when: ansible_network_os == 'cisco.nxos.nxos'

    # --- [파일 저장] ---
    - name: Save Config to File
      ansible.builtin.copy:
        content: "{{ ios_config.stdout[0] if ansible_network_os == 'cisco.ios.ios' else nxos_config.stdout[0] }}"
        dest: "/var/log/netops/backups/{{ ansible_date_time.date }}/{{ inventory_hostname }}.cfg"
      delegate_to: localhost

PHASE 4. 실행 및 자동화 (Script & Crontab)

4-1. 실행 스크립트 생성 (run_backup.sh)

Crontab의 환경변수 문제를 해결하기 위해 Wrapper Script를 사용합니다.

run_backup.sh
#!/bin/bash

# 1. 시작 로그
echo "Job Started: $(date)" >> /var/log/netops/cron_history.log

# 2. PATH 강제 주입 (pip/ansible 경로 포함)
export PATH=$PATH:/home/netops/.local/bin

# 3. 작업 디렉토리 이동
cd /var/log/netops

# 4. 실행 (절대 경로 및 옵션 포함)
ansible-playbook \
  -i hosts.ini \
  backup.yml \
  --vault-password-file .vault_pass \
  --limit all \
  >> /var/log/netops/cron_history.log 2>&1

echo "Job Finished: $(date)" >> /var/log/netops/cron_history.log

※ 실행 권한 부여 (필수):

chmod +x /var/log/netops/run_backup.sh

4-2. Crontab 등록

# crontab -e
# 매주 월요일 02:00 실행 (깔끔하게 파일 하나만 호출)
0 2 * * 1 /var/log/netops/run_backup.sh


이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

← 메인으로 돌아가기

error: Content is protected !!