본문 바로가기
IT/HomeLabs

[홈랩 IaC 자동화 #6] AWX + Terraform 연동 - 버튼 한 번으로 Proxmox VM 자동 생성

by 수누다 2026. 3. 31.

환경 정보

항목 내용
AWX 24.6.1 (K3s + AWX Operator 2.19.1)
Terraform v1.9.x (AWX 서버에 설치)
Provider bpg/proxmox v0.99.0
Proxmox VE 8.x
작업 서버 Rocky Linux 9 (AWX 서버)

5편에서 Terraform + Ansible 연동까지 완료한 상태에서 진행합니다.


이번 편 목표

AWX Job Template ▶️ 클릭
    ↓ (자동)
terraform init
    ↓
terraform apply
    ↓
Proxmox VM 자동 생성
    ↓
IP 자동 감지 및 출력

클릭 한 번으로 VM이 자동으로 만들어지는 완전 자동화 파이프라인 완성!


핵심 아이디어

AWX는 Ansible Playbook을 실행하는 플랫폼입니다. Ansible Playbook 안에서 terraform 명령어를 실행하면 AWX 버튼 클릭 한 번으로 Terraform까지 자동 실행할 수 있습니다.

AWX → Ansible Playbook → terraform apply → Proxmox VM 생성

중요한 함정 — AWX 컨테이너 안에는 Terraform이 없다

처음에 Playbook을 그냥 실행하면 이런 오류가 납니다:

TASK [terraform init]
fatal: [localhost]: FAILED! => {
    "msg": "No such file or directory: 'terraform'"
}

원인: AWX는 K3s 컨테이너 안에서 Playbook을 실행합니다. 컨테이너 안에는 Terraform이 없습니다.

해결: Terraform이 설치된 AWX 서버 호스트를 인벤토리에 등록하고, 그 서버에서 Playbook을 실행하게 합니다.


STEP 1. AWX 서버를 인벤토리에 등록

Resources → Inventories → homelab-ubuntu
→ Hosts 탭 → Add
항목
Name awx-server
Variables ansible_host: 192.168.x.xxx ansible_user: root

STEP 2. AWX 서버 자신에게 SSH 키 복사

AWX가 SSH로 AWX 서버에 접속해야 합니다. 자기 자신에게 키를 복사합니다.

# AWX 서버 터미널에서
ssh-copy-id root@192.168.x.xxx   # AWX 서버 자신의 IP

# 테스트
ssh root@192.168.x.xxx hostname
# 출력: awx-lab

STEP 3. Terraform Playbook 작성

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

cat > $PVC_PATH/homelab/terraform_apply.yml << 'EOF'
---
- name: Terraform으로 Proxmox VM 생성
  hosts: awx-server
  gather_facts: false

  vars:
    terraform_dir: /root/terraform/proxmox-vm

  tasks:
    - name: terraform init
      ansible.builtin.command:
        cmd: terraform init -no-color
        chdir: "{{ terraform_dir }}"
      register: init_result

    - name: init 결과 출력
      ansible.builtin.debug:
        msg: "{{ init_result.stdout_lines }}"

    - name: terraform apply
      ansible.builtin.command:
        cmd: terraform apply -auto-approve -no-color
        chdir: "{{ terraform_dir }}"
      register: apply_result

    - name: apply 결과 출력
      ansible.builtin.debug:
        msg: "{{ apply_result.stdout_lines }}"

    - name: VM IP 확인
      ansible.builtin.command:
        cmd: terraform output -no-color vm_ips
        chdir: "{{ terraform_dir }}"
      register: ip_result

    - name: IP 출력
      ansible.builtin.debug:
        msg: "{{ ip_result.stdout_lines }}"
EOF

chown -R 1000:1000 $PVC_PATH/homelab/

STEP 4. AWX Job Template 생성

Resources → Templates → Add → Add job template
항목
Name terraform-apply
Job Type Run
Inventory homelab-ubuntu
Project homelab-project
Playbook terraform_apply.yml
Credentials homelab-ssh-key
Options ✅ Enable Privilege Escalation

Save 클릭

📸 캡처 타이밍!
→ Job Template 설정 화면


STEP 5. 실행! ▶️

Templates → terraform-apply → ▶️ Launch

실행 로그:

PLAY [Terraform으로 Proxmox VM 생성] ***************************

TASK [terraform init] ******************************************
changed: [awx-server]

TASK [init 결과 출력] *******************************************
ok: [awx-server] => {
    "msg": [
        "Initializing the backend...",
        "Initializing provider plugins...",
        "- Reusing previous version of bpg/proxmox",
        "- Using previously-installed bpg/proxmox v0.99.0",
        "Terraform has been successfully initialized!"
    ]
}

TASK [terraform apply] *****************************************
changed: [awx-server]

TASK [apply 결과 출력] ******************************************
ok: [awx-server] => {
    "msg": [
        "Apply complete! Resources: 3 added, 0 changed, 0 destroyed.",
        "Outputs:",
        "vm_ips = {"
        ...
    ]
}

TASK [VM IP 확인] **********************************************
changed: [awx-server]

TASK [IP 출력] *************************************************
ok: [awx-server] => {
    "msg": [
        "ansible-target-01 = 192.168.x.xx",
        "ansible-target-02 = 192.168.x.xx"
    ]
}

PLAY RECAP *****************************************************
awx-server : ok=6  changed=3  unreachable=0  failed=0

📸 캡처 타이밍!

1. AWX terraform-apply 성공 화면 (✅ 성공 배지)
2. 실행 로그 — IP 출력 화면
3. Proxmox UI — VM 자동 생성 확인


트러블슈팅

No such file or directory: 'terraform'

원인: AWX가 K3s 컨테이너 안에서 실행되는데 컨테이너 안에 Terraform 없음

해결: Playbook의 hostslocalhost 대신 AWX 서버 호스트로 변경

# 잘못된 방식
- hosts: localhost

# 올바른 방식
- hosts: awx-server   # 인벤토리에 등록한 AWX 서버

Permission denied (publickey) — awx-server 접속 실패

원인: AWX가 AWX 서버 자신에게 SSH로 접속해야 하는데 키가 없음

해결: 자기 자신에게 SSH 키 복사

ssh-copy-id root@AWX서버IP

최종 자동화 파이프라인

AWX 웹 UI ▶️ 클릭
    ↓
Ansible → terraform init
    ↓
Ansible → terraform apply
    ↓
Proxmox VM 자동 생성 (cloud-init 포함)
    ↓
qemu-guest-agent 자동 설치
    ↓
IP 자동 감지 및 AWX 출력

이제 AWX 웹 브라우저에서 버튼 하나로 VM을 만들 수 있습니다!


마무리

AWX + Terraform 연동에서 핵심은 AWX가 컨테이너 안에서 실행된다는 점을 이해하는 것이었습니다. 처음에 localhost로 설정했다가 terraform을 못 찾는 오류를 만났는데, AWX 서버 자체를 인벤토리에 등록하고 SSH로 접속해서 실행하는 방식으로 해결했습니다.

그리고 자기 자신에게 ssh-copy-id를 한다는 게 처음엔 이상하게 느껴졌지만, AWX 컨테이너 → AWX 호스트 SSH 연결이라고 생각하면 당연한 설정입니다.

6편까지 오면서 홈랩 IaC 자동화의 전체 흐름이 완성됐습니다:

AWX (Ansible GUI)
+ Terraform (인프라 프로비저닝)
+ Ansible Playbook (초기 설정)
+ 텔레그램 알림
= 완전 자동화 홈랩

다음 편 예고: [홈랩 IaC 자동화 #7] GitOps — GitHub에 코드 Push하면 자동으로 VM 생성


참고 링크


메타 설명 (검색 노출용)

AWX Job Template에서 Terraform을 실행해 Proxmox VM을 자동 생성하는 방법. AWX 컨테이너 terraform 없음 오류, SSH Permission denied 해결 포함. 버튼 한 번으로 VM 자동 생성 완성.