본문 바로가기

DevOps/Terraform

(10) 테라폼으로 vmware 가상리소스 배포

cloudNet@ 팀의 가시다 님이 진행하는 테라폼 102 스터디 3주차 정리입니다.

3주차 내용: 

테라폼 프로바이더

  • 프로바이더란?
  • vsphere 프로바이더 사용법
  • vsphere 자격증명 설정
  • os golden image 생성 *매우 중요*
  • vmware template 사용하여 vm 배포

1. 프로바이더?

  • 테라폼은 terraform 바이너리 파일을 시작으로 로컬 환경에나 배포 서버와 같은 원격 환경에서 원하는 대상을 호출하는 방식으로 실행된다.
  • 이때 ‘원하는 대상’은 호출하는 방식이 서로 다르지만 대상의 공급자, 즉 프로바이더가 제공하는 API를 호출해 상호작용을 한다. 여기서 테라폼이 대상과의 상호작용을 할 수 있도록 하는 것이 ‘프로바이더’다.
  • 즉, AWS에 원하는 리소스를 생성 하려 할때 상호작용 하는 프로바이더는 AWS 이고
  • VMware에 원하는 리소스를 생성 하려 할때 상호작용 하는 프로바이더는 Vsphere 이다.

  • 각 프로바이더의 API구현은 서로 다르지만 테라폼의 고유 문법으로 동일한 동작을 수행하도록 구현되어 있다.
  • 프로바이더는 플러그인 형태로 테라폼에 결합되어 대상이 되는 클라우드, SaaS, 기타 서비스의 자체 API를 사용해 동작을 수행한다.
  • 각 프로바이더는 테라폼이 관리하는 리소스 유형과 데이터 소스를 사용할 수 있도록 연결한다.
  • 즉, 테라폼은 프로바이더 없이는 어떤 종류의 인프라와 서비스도 관리할 수 없다는 의미다. 대부분의 프로바이더는 대상 인프라 환경이나 서비스 환경에 대한 리소스를 관리하므로, 프로바이더를 구성할 때는 대상과의 연결과 인증에 필요한 정보가 제공되어야 한다.
  • 테라폼 레지스트리 사이트에서 주요 프로바이더와 관련 문서를 확인 가능

2. vsphere 프로바이더 사용방법

  • 테라폼 레지스트리를 확인해보면 Official 프로바이더로 하시코프가 직접 관리하고 있는 프로바이더를 사용할수 있다.

  • 사용해보자. main.tf를 만든다.
terraform {
  required_providers {
    vsphere = {
      source = "hashicorp/vsphere"
      version = "2.4.1"
    }
  }
}

provider "vsphere" {
  # Configuration options
}
  • 테라폼 init을 하면 provider-vsphere가 생성이 된다.
  • # terraform init 명령어로 테라폼을 시작하기 위한 준비를 진행합니다.
  • # (backend 구성 초기화, 플러그인 설치 등)
  • # backend로 지정된 구성 설정을 초기화합니다.
  • # `.terraform` 폴더가 생성되며 관련한 플러그인을 가져옵니다.
  • # Provider를 기록하기 위해 암호화된 `.terraform.lock.hcl` 파일을 생성합니다.


3.  vsphere 자격증명 설정

  • vCenter의 접속정보를 입력합니다.
  • vCenter의 DNS를 입력합니다.
provider "vsphere" {
  user                 = "administrator@vsphere.local"
  password             = "Matilda00!"
  vsphere_server       = "vcsa01.matilda-mzc.com"
  allow_unverified_ssl = true
}

4. data 블록을 통한 resource 선언

  • VMware는 물리적인 리소스 분류 기준이 아닌 논리적인 리소스 분류 기준을 가지고 있습니다.
  • 데이터센터 > 클러스터 >  호스트 > 가상머신 형태로 리소스를 분류 합니다.

  • 스토리지, 네트워크 , 컴퓨팅 역시 정의 해야합니다. ( data 블록으로 정의 하여 사용합니다. )

  • 마지막으로 template을 정의하여 사용합니다. 
템플릿은 표준 이미지(골든 이미지) 생성을 위해 사용자가 OS 설치 이후 접속하여 패키지, 파일, 설정 들을 수행 후 
IP 또는 네트워크 어뎁터를 제거한 후 해당 VM을 템플릿으로 전환할수 있습니다.
  • Packer와 같은 이미지 Metadata에 대한 Registry를 사용하셔도 됩니다.
data "vsphere_datacenter" "datacenter" {
  name = "MATILDA DC"
}

data "vsphere_compute_cluster" "cluster" {
  name          = "MATILDA ZONE"
  datacenter_id = data.vsphere_datacenter.datacenter.id
}


data "vsphere_datastore" "datastore" {
  name          = "Datastore-DATA"
  datacenter_id = data.vsphere_datacenter.datacenter.id
}


data "vsphere_network" "network" {
  name          = "서비스 네트워크 #5"
  datacenter_id = data.vsphere_datacenter.datacenter.id
}

data "vsphere_virtual_machine" "template" {
  name          = "vra-ubuntu20.04_02"
  datacenter_id = data.vsphere_datacenter.datacenter.id
}
  • 현재 제 vSphere 환경에서 사용 가능한 리소스들을 naming을 기반으로 입력하여 선언할수 있습니다.

5. OS 설치 및 Golden 이미지 만들기

https://themapisto.tistory.com/116


6. vm 배포

  • resource_pool은 클러스터를 선언하면 자동으로 사용가능 합니다.
  • 데이터 스토어와 네트워크는 선언된 스토리지와 네트워크를 사용 합니다. ( 참고로 아래에 ip 대역은 해당 네트워크의 대역에서 ping 쏴보고 확인 해보고 ip가 충돌되지 않게 잘 설정해주셔야 합니다 )
  • firmware는 "bios로 설정하면" 에러가 발생 - UEFI 모드로 설정 
  • UEFI 모드는 최신 PC용의 표준 펌웨어 인터페이스로 PC 기술이 진보함에 따른 온도와 전력 모니터링, 원격 보안 관리, 가상화, 새로운 디스크 관리 형식, 2TB 이상의 디스크 지원 등 여러 기능이 추가되어 기존의 BIOS 및 EFI를 대체하는 새로운 유틸리티이다.
resource "vsphere_virtual_machine" "vm" {
  name             = "koo-terraform-vsphere"
  resource_pool_id = data.vsphere_compute_cluster.cluster.resource_pool_id
  datastore_id     = data.vsphere_datastore.datastore.id
  num_cpus         = 2
  memory           = 2048
  guest_id         = "ubuntu64Guest"
  firmware = "efi"
  network_interface {
    network_id = data.vsphere_network.network.id
  }
  disk {
    label = "disk"
    size  = 50
  }
  clone {
    template_uuid = data.vsphere_virtual_machine.template.id
    customize {
      linux_options {
        host_name = "hello-world"
        domain    = "example.com"
      }
      network_interface {
        ipv4_address = "10.20.4.165"
        ipv4_netmask = 24
      }
      ipv4_gateway = "10.20.4.1"
    }
  }
}
  • 가상머신 배포!
  • 확인 

  • IP 세팅이 잘되었는지 확인해보자

Clear!