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 웹사이트에서
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