[테라폼] 테라폼(Terraform) 완전 정복: VMware vSphere를 Terraform으로 완전 자동화하기: VM 마스터 - 1
클라우드가 대세인 시대지만, 여전히 많은 기업들은 프라이빗 데이터센터를 기반으로 한 가상화 인프라를 운영하고 있습니다. 그중 대표적인 솔루션이 바로 VMware vSphere입니다. 이번 글에서는 Terraform을 이용하여 vSphere 환경 위에 VM을 프로비저닝하고 관리하는 방법을 풀어보겠습니다. 중간중간 실습 예제도 끼워넣어 이해를 돕겠습니다.
vSphere Provider 기본 이해하기
Terraform이 vSphere 환경과 통신하려면 vsphere
provider를 사용해야 합니다. 이 provider는 vCenter Server API를 통해 VMware 환경을 조작합니다. 단순히 VM을 만드는 것뿐만 아니라, 디스크 추가, NIC 설정, 클러스터 선택, 리소스 풀 지정 등 광범위한 작업을 지원합니다.
vSphere Provider를 사용하려면 vCenter Server의 주소, 인증 계정, SSL 인증서 신뢰 여부 등을 설정해주어야 합니다.
vSphere 환경 준비하기
Terraform으로 vSphere를 다루기 전에 다음과 같은 준비가 필요합니다.
- vCenter Server가 반드시 구축되어 있어야 합니다. (ESXi 단독은 불가)
- 서비스 계정을 생성하고 필요한 권한을 부여합니다. (읽기, 쓰기, VM 생성 권한)
- VM Template을 하나 만들어 둡니다. 대부분 Terraform으로는 Template을 복제하여 VM을 만들기 때문입니다.
- Datastore, Network(Port Group), Resource Pool을 사전에 준비해 둡니다.
이러한 준비가 되어 있어야 Terraform 코드가 실패 없이 동작할 수 있습니다.
Terraform 설정 파일 구성하기
디렉토리를 하나 만들고, provider
, resource
, variables
파일을 구성합니다.
provider 설정
먼저 vSphere Provider를 선언합니다.
provider "vsphere" {
user = var.vsphere_user
password = var.vsphere_password
vsphere_server = var.vsphere_server
allow_unverified_ssl = true
}
여기서 allow_unverified_ssl
은 vCenter에 자체 서명된 인증서를 쓸 경우 true로 설정합니다. 기업 환경에서는 SSL 인증을 강제할 수도 있으니 주의해야 합니다.
기본 VM 생성하기
가장 기본적인 vSphere VM 생성을 예로 들어보겠습니다.
resource "vsphere_virtual_machine" "vm" {
name = "terraform-test-vm"
resource_pool_id = data.vsphere_resource_pool.pool.id
datastore_id = data.vsphere_datastore.datastore.id
num_cpus = 2
memory = 4096
guest_id = data.vsphere_virtual_machine.template.guest_id
network_interface {
network_id = data.vsphere_network.network.id
adapter_type = data.vsphere_virtual_machine.template.network_interface_types[0]
}
disk {
label = "disk0"
size = data.vsphere_virtual_machine.template.disks.0.size
eagerly_scrub = false
thin_provisioned = data.vsphere_virtual_machine.template.disks.0.thin_provisioned
}
clone {
template_uuid = data.vsphere_virtual_machine.template.id
customize {
linux_options {
host_name = "terraform-test-vm"
domain = "local"
}
network_interface {
ipv4_address = "192.168.1.100"
ipv4_netmask = 24
}
ipv4_gateway = "192.168.1.1"
}
}
}
이 코드는 Template을 복제하여 새 VM을 생성하고, 기본 CPU/메모리/디스크/네트워크를 설정한 뒤, IP를 커스터마이징하여 배포합니다. 복제할 Template은 data
블록을 통해 미리 불러와야 합니다.
데이터 소스 설정하기
위 예제에서 사용된 data
소스는 다음처럼 미리 정의합니다.
data "vsphere_datacenter" "dc" {
name = "Datacenter"
}
data "vsphere_datastore" "datastore" {
name = "datastore1"
datacenter_id = data.vsphere_datacenter.dc.id
}
data "vsphere_resource_pool" "pool" {
name = "Resources"
datacenter_id = data.vsphere_datacenter.dc.id
}
data "vsphere_network" "network" {
name = "VM Network"
datacenter_id = data.vsphere_datacenter.dc.id
}
data "vsphere_virtual_machine" "template" {
name = "ubuntu-template"
datacenter_id = data.vsphere_datacenter.dc.id
}
데이터 소스는 VMware 인프라의 기존 리소스를 읽어들이는 방법입니다. VM 생성 시 이 데이터들을 활용하여 리소스 간 연결을 수행합니다.
여러 VM을 한 번에 생성하기
Terraform의 count
를 이용하면 다수의 VM을 동시에 만들 수 있습니다.
resource "vsphere_virtual_machine" "multi_vm" {
count = 3
name = "multi-vm-${count.index}"
resource_pool_id = data.vsphere_resource_pool.pool.id
datastore_id = data.vsphere_datastore.datastore.id
num_cpus = 2
memory = 4096
guest_id = data.vsphere_virtual_machine.template.guest_id
network_interface {
network_id = data.vsphere_network.network.id
adapter_type = data.vsphere_virtual_machine.template.network_interface_types[0]
}
disk {
label = "disk0"
size = 40
eagerly_scrub = false
thin_provisioned = true
}
clone {
template_uuid = data.vsphere_virtual_machine.template.id
customize {
linux_options {
host_name = "multi-vm-${count.index}"
domain = "local"
}
network_interface {
ipv4_address = "192.168.1.${100 + count.index}"
ipv4_netmask = 24
}
ipv4_gateway = "192.168.1.1"
}
}
}
이 코드는 multi-vm-0
, multi-vm-1
, multi-vm-2
총 3개의 VM을 만들어서, 각각 다른 IP를 설정하는 예제입니다.
커스터마이징 스펙(Customization Spec) 적용하기
vSphere에서는 "Customization Spec"이라는 기능으로 VM 부팅 시 초기 설정을 쉽게 할 수 있습니다. Terraform에서도 이를 적용할 수 있습니다.
clone {
template_uuid = data.vsphere_virtual_machine.template.id
customize {
windows_options {
computer_name = "win-vm"
admin_password = "P@ssw0rd123"
}
network_interface {
ipv4_address = "192.168.1.150"
ipv4_netmask = 24
}
ipv4_gateway = "192.168.1.1"
}
}
이처럼 Linux뿐 아니라 Windows VM 초기 설정도 쉽게 적용할 수 있습니다.
Output 설정하기
배포된 VM의 이름과 IP를 출력하려면 다음처럼 작성할 수 있습니다.
output "vm_names" {
value = vsphere_virtual_machine.multi_vm[*].name
}
output "vm_ips" {
value = [for vm in vsphere_virtual_machine.multi_vm : vm.default_ip_address]
}
Apply 완료 후 바로 VM들의 이름과 IP를 확인할 수 있습니다.
실전 팁 모음
- 디스크 추가:
disk
블록을 여러 개 선언하면 추가 디스크를 붙일 수 있습니다. - 리소스 풀 분리: 프로젝트별로 다른 리소스 풀을 쓸 경우
for_each
를 사용할 수 있습니다. - IP 자동 할당: DHCP 환경에서는
ipv4_address
를 생략하고 자동으로 IP를 받게 설정할 수 있습니다. - VM 태깅: vSphere의 태그 기능도 Terraform을 통해 관리 가능합니다.
- 운영 자동화: 주기적으로 VM 상태를 모니터링하고, 필요시
terraform destroy
로 일괄 삭제할 수 있습니다.
마무리
이 문서에서는 Terraform을 활용하여 VMware vSphere 환경 위에 가상머신을 자동으로 생성하고 관리하는 방법을 서술형으로 자세히 살펴보았습니다. Provider 설정, 기본 VM 배포, 다중 VM 배포, 네트워크 설정, 커스터마이징 적용까지 전체 흐름을 자연스럽게 따라올 수 있도록 구성했습니다.
다음 편에서는 Terraform 모듈화를 통해 대규모 VMware 인프라를 효율적으로 관리하는 방법, 그리고 VM 라이프사이클 자동화를 위한 고급 테크닉까지 다룰 예정입니다.
Terraform과 vSphere를 결합하면 프라이빗 클라우드 인프라도 퍼블릭 클라우드처럼 유연하고 코드 중심으로 관리할 수 있게 됩니다. 이 문서가 첫걸음을 디딛는 데 도움이 되기를 바랍니다.