본문 바로가기
IT/HomeLabs

[홈랩 IaC 자동화 #2] Ansible AWX로 Ubuntu 서버 6대 Playbook 실행하기

by 수누다 2026. 3. 24.

환경 정보

항목 내용
AWX 24.6.1 (K3s + AWX Operator 2.19.1)
관리 대상 Ubuntu 서버 6대
접속 계정 root
Playbook ping_test / system_info / apt_update

1편에서 AWX 설치를 완료한 상태에서 진행합니다.
설치 방법은 [[홈랩 IaC 자동화 #1] Ansible AWX 설치 - K3s + AWX Operator로 Playbook GUI 환경 구축] 참고


전체 흐름

Ubuntu 서버 root SSH 접근 허용
    ↓
AWX 서버 → 각 서버 SSH 키 복사
    ↓
AWX UI: 인벤토리 등록 (서버 6대)
    ↓
AWX UI: 자격증명 등록 (SSH 키)
    ↓
AWX UI: 프로젝트 등록 (Playbook 파일)
    ↓
AWX UI: 잡 템플릿 생성 → 실행!

STEP 1. Ubuntu 서버 root SSH 접근 허용

Ubuntu는 기본적으로 root SSH 접속이 막혀 있다. 관리 대상 서버 6대에서 각각 실행한다.

# root 비밀번호 설정
sudo passwd root

# SSH 설정 수정
sudo sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sudo sed -i 's/^PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config

# 설정 확인
grep PermitRootLogin /etc/ssh/sshd_config
# 출력: PermitRootLogin yes

# SSH 재시작
sudo systemctl restart ssh

STEP 2. AWX 서버에서 SSH 키 생성 및 복사

# SSH 키 생성
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""

# 6대 서버에 키 복사 (비밀번호 입력 필요)
ssh-copy-id root@192.168.x.101
ssh-copy-id root@192.168.x.102
ssh-copy-id root@192.168.x.103
ssh-copy-id root@192.168.x.104
ssh-copy-id root@192.168.x.105
ssh-copy-id root@192.168.x.106

접속 테스트

for ip in 101 102 103 104 105 106; do
  echo -n "192.168.x.$ip : "
  ssh -o ConnectTimeout=3 root@192.168.x.$ip hostname 2>/dev/null || echo "실패"
done

예상 출력:

192.168.x.101 : server-01
192.168.x.102 : server-02
192.168.x.103 : server-03
192.168.x.104 : server-04
192.168.x.105 : server-05
192.168.x.106 : server-06

STEP 3. Playbook 파일 작성

AWX는 K3s 컨테이너 안에서 동작하므로 PVC 실제 경로에 파일을 넣어야 한다.

PVC 경로 확인

find /var/lib/rancher/k3s/storage/ -type d -name "*projects*"
/var/lib/rancher/k3s/storage/pvc-xxxxx_awx_awx-projects-claim

프로젝트 디렉토리 생성 및 Playbook 작성

PVC_PATH=$(find /var/lib/rancher/k3s/storage/ -type d -name "*awx-projects-claim*")
mkdir -p $PVC_PATH/homelab

1. ping_test.yml — 연결 테스트

cat > $PVC_PATH/homelab/ping_test.yml << 'EOF'
---
- name: 연결 테스트
  hosts: all
  gather_facts: false
  tasks:
    - name: Ping 테스트
      ansible.builtin.ping:
    - name: 결과 표시
      ansible.builtin.debug:
        msg: "{{ inventory_hostname }} ({{ ansible_host }}) 응답 완료"
EOF

2. system_info.yml — 시스템 정보 수집

cat > $PVC_PATH/homelab/system_info.yml << 'EOF'
---
- name: 시스템 정보 수집
  hosts: all
  gather_facts: true
  tasks:
    - name: OS 정보 출력
      ansible.builtin.debug:
        msg:
          - "호스트명 : {{ ansible_hostname }}"
          - "OS      : {{ ansible_distribution }} {{ ansible_distribution_version }}"
          - "커널    : {{ ansible_kernel }}"
          - "CPU     : {{ ansible_processor_vcpus }} vCPU"
          - "RAM     : {{ (ansible_memtotal_mb / 1024) | round(1) }} GB"
          - "IP      : {{ ansible_default_ipv4.address }}"
EOF

3. apt_update.yml — 패키지 업데이트

cat > $PVC_PATH/homelab/apt_update.yml << 'EOF'
---
- name: APT 패키지 업데이트
  hosts: all
  gather_facts: false
  become: true
  tasks:
    - name: apt 캐시 업데이트
      ansible.builtin.apt:
        update_cache: yes
        cache_valid_time: 3600
    - name: 업데이트 결과 출력
      ansible.builtin.debug:
        msg: "{{ inventory_hostname }} 업데이트 완료"
EOF

권한 설정 (AWX uid: 1000)

chown -R 1000:1000 $PVC_PATH/homelab
chmod -R 755 $PVC_PATH/homelab

⚠️ PVC 경로 주의: AWX가 K3s 위에서 동작하므로 호스트의 /var/lib/awx/projects에 파일을 넣어도 소용없다. 반드시 K3s PVC 실제 경로인 /var/lib/rancher/k3s/storage/pvc-xxx_awx_awx-projects-claim/ 안에 넣어야 한다.


STEP 4. AWX UI — 인벤토리 등록

Resources → Inventories → Add → Add inventory
항목
Name homelab-ubuntu
Organization Default

저장 후 Hosts 탭 → Add 로 6대 추가:

Name Variables
server-01 ansible_host: 192.168.x.101
server-02 ansible_host: 192.168.x.102
server-03 ansible_host: 192.168.x.103
server-04 ansible_host: 192.168.x.104
server-05 ansible_host: 192.168.x.105
server-06 ansible_host: 192.168.x.106


STEP 5. AWX UI — 자격증명 등록

# AWX 서버에서 개인키 복사
cat ~/.ssh/id_rsa
Resources → Credentials → Add
항목
Name homelab-ssh-key
Credential Type Machine
Username root
SSH Private Key 위에서 복사한 키 전체 붙여넣기

STEP 6. AWX UI — 프로젝트 등록

Resources → Projects → Add
항목
Name homelab-project
Organization Default
Source Control Type Manual
Playbook Directory homelab

드롭다운에 homelab이 안 보이면 PVC 권한 설정 확인 (chown -R 1000:1000)


STEP 7. 잡 템플릿 생성 및 실행

ping-test 템플릿

Resources → Templates → Add → Add job template
항목
Name ping-test
Job Type Run
Inventory homelab-ubuntu
Project homelab-project
Playbook ping_test.yml
Credentials homelab-ssh-key

Save → ▶️ Launch

실행 결과

PLAY [연결 테스트] ******************************************

TASK [Ping 테스트] ******************************************
ok: [server-01]
ok: [server-02]
ok: [server-03]
ok: [server-04]
ok: [server-05]
ok: [server-06]

PLAY RECAP **************************************************
server-01 : ok=2  changed=0  unreachable=0  failed=0
server-02 : ok=2  changed=0  unreachable=0  failed=0
server-03 : ok=2  changed=0  unreachable=0  failed=0
server-04 : ok=2  changed=0  unreachable=0  failed=0
server-05 : ok=2  changed=0  unreachable=0  failed=0
server-06 : ok=2  changed=0  unreachable=0  failed=0

system-info 템플릿

같은 방법으로 system_info.yml 잡 템플릿 생성 후 실행.

PLAY RECAP **************************************************
server-01 : ok=2  changed=0  unreachable=0  failed=0
server-02 : ok=2  changed=0  unreachable=0  failed=0
server-03 : ok=2  changed=0  unreachable=0  failed=0
server-04 : ok=2  changed=0  unreachable=0  failed=0
server-05 : ok=2  changed=0  unreachable=0  failed=0
server-06 : ok=2  changed=0  unreachable=0  failed=0


트러블슈팅

Playbook 디렉토리 드롭다운에 아무것도 안 보임

원인: AWX는 K3s PVC 경로를 바라보는데, 호스트의 /var/lib/awx/projects에 파일을 넣으면 인식 못 함

해결: K3s PVC 실제 경로에 파일 생성

# 실제 PVC 경로 확인
find /var/lib/rancher/k3s/storage/ -type d -name "*awx-projects-claim*"

# 해당 경로에 파일 생성 후 권한 설정
chown -R 1000:1000 <PVC 경로>/homelab
chmod -R 755 <PVC 경로>/homelab

root SSH 접속 거부

원인: Ubuntu 기본 설정에서 root SSH 접속 비활성화

해결: 각 Ubuntu 서버에서 PermitRootLogin yes 설정 후 SSH 재시작


마무리

AWX에서 Playbook을 실행해보니 확실히 편하다. 터미널에서 ansible-playbook -i inventory ping_test.yml 치는 것보다 클릭 몇 번으로 6대 서버에 동시 실행되는 게 훨씬 직관적이다.

특히 실행 결과가 UI에서 실시간으로 스크롤되며 보이는 게 좋았다. 어느 서버가 성공/실패인지 한눈에 파악이 된다.

삽질 포인트는 PVC 경로 문제였다. K3s 위에서 AWX가 돌다 보니 호스트 경로와 컨테이너 내부 경로가 다르다는 걸 처음에 몰라서 헤맸다. 이 부분만 알면 나머지는 어렵지 않다.

다음 편 예고: [홈랩 IaC 자동화 #3] AWX 스케줄러 — 매일 자동으로 패키지 업데이트 실행하기


참고 링크


👉 #1화 — Docker Compose로 홈랩 자동화 플랫폼 구축하기
👉 #3화 — AWX 스케줄러 + 텔레그램 알림 - 매일 자동 패키지 업데이트
👉 #4화 — Terraform으로 Proxmox VM 자동 생성하기