DOCS : Docs overview | hashicorp/vsphere | Terraform | Terraform Registry

 

Terraform Registry

 

registry.terraform.io

 

1. 프로젝트 폴더 생성 하기 - 원하는곳에 폴더 만들어서 선택

 

STEP 1.  폴더에 파일 만들기. provider.tf  & 내용 채우기

 

프로바이더는 인프라 제공자를 말하며, 그 중 vsphere 를 택했다.

이유는 사내에 구성이 되있기 때문

 

나는 인프라 엔지니어가 아니라서, 따로 구성해본적이 없기 때문에 어쩔 수 없다.

 

provider.tf 에 들어갈 내용이다.

terraform {
    required_providers {
        vsphere = {
            source = "hashicorp/vsphere"
            version = "2.4.1"
        }
    }
}

provider "vsphere" {
  user                 = "{vsphere.username}"
  password             = "{vsphere.password}"
  vsphere_server       = "{vsphere.address}"
  allow_unverified_ssl = true
}

 

가장 위의 블럭은 프로바이더 제공자의 required 요소인데, 당연히 제공자 이름이 들어가야하고, 어떤 SDK 기반으로 컴파일 할 것인지 정보가 들어간다.

 

다음 블럭은 "프로바이더이름", vsphere 로그인정보와 주소가 들어간다.

 

 

여기서 terraform init 명령을 입력해보자.

 

이렇게나온다.

 

Initializing provider plugins.... 프로바이더와 버전에 맞는 SDK 를 다운받는 것이다.

 

 

없던 파일이 생겨났다.

 

여기까지하면, 나는 테라폼으로 vsphere 를 제어할껀데, 필요한 sdk 를 받을꺼라는 것을 provider.tf 에 적어준것이고

terraform init 명령으로 다운받기 까지 완료한 상태이다. 

 

 

STEP 2. main.tf 파일 생성후 내용 채우기

data 명령줄에는 vsphere 의 리소스 위치를 선택할 수 있다.

 

UI 로 따지면, 상위 카테고리에서 하위카테고리로 선택해서 들어가면서 위치와 옵션을 선택하는 과정이라 보면 된다.

 

resource 는 서버에서 할당할 수 있는 리소스를 의미한다.

 

VM 을 만든다면, 여기에 할당할 리소스들 "cpu, disk, ram, network" 등이 되겠다.

 

name = "실제 이름" 이 들어간다.

 

data "vsphere_datacenter" "datacenter" {
    name = "Datacenter"
}

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

data "vsphere_datastore" "datastore" {
  name          = "Fujitsu03"
  datacenter_id = data.vsphere_datacenter.datacenter.id
}


data "vsphere_network" "network" {
  name          = "VM Network"
  datacenter_id = data.vsphere_datacenter.datacenter.id
}

data "vsphere_virtual_machine" "template" {
  name          = "win2019"
  datacenter_id = data.vsphere_datacenter.datacenter.id
}

resource "vsphere_virtual_machine" "vm" {
  name             = "win2019-terraform1"
  resource_pool_id = data.vsphere_compute_cluster.cluster.resource_pool_id
  datastore_id     = data.vsphere_datastore.datastore.id
  num_cpus         = 4
  memory           = 8196
  guest_id         = data.vsphere_virtual_machine.template.guest_id
  scsi_type        = data.vsphere_virtual_machine.template.scsi_type
 
  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
    thin_provisioned = data.vsphere_virtual_machine.template.disks.0.thin_provisioned
  }

  firmware = "efi"
 
  clone {
    template_uuid = data.vsphere_virtual_machine.template.id
    linked_clone = "true"
    customize {
      windows_options {
        computer_name = "ssssss"
      }
      network_interface {
        ipv4_address = "192.168.123.239"
        ipv4_netmask = 24
      }
      ipv4_gateway = "192.168.123.1"
    }
  }
}

firmware = "efi" 를 명시해주지 않으면, bios 로 선택되면서 깡통 vm 으로 배포시도하다가 실패하게 된다.
그리고, 네트워크가 통신이 되지않아도 세그먼트를 붙이고 배포가 가능했는데 이경우에는 네트워크가 유효하지 않으면 배포실패한다. 그럼에도 "네트워크"에러다 이렇게 알려주질 않으니 찾기 어렵다.
 

STEP 3. terraform apply

terraform apply 명령을 터미널에 입력하면, 아래 처럼 나온다.
git cli 처럼 + - 같이 추가 삭제 이런 변경사항을 다 표시해준다.
PS C:\Users\jaeyo\Desktop\terraform> terraform apply
data.vsphere_datacenter.datacenter: Reading...
data.vsphere_datacenter.datacenter: Read complete after 0s [id=datacenter-1001]
data.vsphere_compute_cluster.cluster: Reading...
data.vsphere_network.network: Reading...
data.vsphere_virtual_machine.template: Reading...
data.vsphere_datastore.datastore: Reading...
data.vsphere_network.network: Read complete after 0s [id=network-1016]
data.vsphere_datastore.datastore: Read complete after 0s [id=datastore-1014]
data.vsphere_compute_cluster.cluster: Read complete after 0s [id=domain-c1050]
data.vsphere_virtual_machine.template: Read complete after 0s [id=423e0473-2b46-603b-852b-c97d2d48fa85]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # vsphere_virtual_machine.vm will be created
  + resource "vsphere_virtual_machine" "vm" {
      + annotation                              = (known after apply)
      + boot_retry_delay                        = 10000
      + change_version                          = (known after apply)
      + cpu_limit                               = -1
      + cpu_share_count                         = (known after apply)
      + cpu_share_level                         = "normal"
      + datastore_id                            = "datastore-1014"
      + default_ip_address                      = (known after apply)
      + ept_rvi_mode                            = "automatic"
      + extra_config_reboot_required            = true
      + firmware                                = "efi"
      + force_power_off                         = true
      + guest_id                                = "windows2019srv_64Guest"
      + guest_ip_addresses                      = (known after apply)
      + hardware_version                        = (known after apply)
      + host_system_id                          = (known after apply)
      + hv_mode                                 = "hvAuto"
      + id                                      = (known after apply)
      + ide_controller_count                    = 2
      + imported                                = (known after apply)
      + latency_sensitivity                     = "normal"
      + memory                                  = 8196
      + memory_limit                            = -1
      + memory_share_count                      = (known after apply)
      + memory_share_level                      = "normal"
      + migrate_wait_timeout                    = 30
      + moid                                    = (known after apply)
      + name                                    = "win2019-terraform-20231113"
      + num_cores_per_socket                    = 1
      + num_cpus                                = 4
      + power_state                             = (known after apply)
      + poweron_timeout                         = 300
      + reboot_required                         = (known after apply)
      + resource_pool_id                        = "resgroup-1051"
      + run_tools_scripts_after_power_on        = true
      + run_tools_scripts_after_resume          = true
      + run_tools_scripts_before_guest_shutdown = true
      + run_tools_scripts_before_guest_standby  = true
      + sata_controller_count                   = 0
      + scsi_bus_sharing                        = "noSharing"
      + scsi_controller_count                   = 1
      + scsi_type                               = "lsilogic-sas"
      + shutdown_wait_timeout                   = 3
      + storage_policy_id                       = (known after apply)
      + swap_placement_policy                   = "inherit"
      + tools_upgrade_policy                    = "manual"
      + uuid                                    = (known after apply)
      + vapp_transport                          = (known after apply)
      + vmware_tools_status                     = (known after apply)
      + vmx_path                                = (known after apply)
      + wait_for_guest_ip_timeout               = 0
      + wait_for_guest_net_routable             = true
      + wait_for_guest_net_timeout              = 5

      + clone {
          + linked_clone  = true
          + template_uuid = "423e0473-2b46-603b-852b-c97d2d48fa85"
          + timeout       = 30

          + customize {
              + ipv4_gateway = "192.168.123.1"
              + timeout      = 10

              + network_interface {
                  + ipv4_address = "192.168.123.240"
                  + ipv4_netmask = 24
                }

              + windows_options {
                  + auto_logon_count  = 1
                  + computer_name     = "win2019-20231113"
                  + full_name         = "Administrator"
                  + organization_name = "Managed by Terraform"
                  + time_zone         = 85
                }
            }
        }

      + disk {
          + attach            = false
          + controller_type   = "scsi"
          + datastore_id      = "<computed>"
          + device_address    = (known after apply)
          + disk_mode         = "persistent"
          + disk_sharing      = "sharingNone"
          + eagerly_scrub     = false
          + io_limit          = -1
          + io_reservation    = 0
          + io_share_count    = 0
          + io_share_level    = "normal"
          + keep_on_remove    = false
          + key               = 0
          + label             = "disk0"
          + path              = (known after apply)
          + size              = 90
          + storage_policy_id = (known after apply)
          + thin_provisioned  = false
          + unit_number       = 0
          + uuid              = (known after apply)
          + write_through     = false
        }

      + network_interface {
          + adapter_type          = "e1000e"
          + bandwidth_limit       = -1
          + bandwidth_reservation = 0
          + bandwidth_share_count = (known after apply)
          + bandwidth_share_level = "normal"
          + device_address        = (known after apply)
          + key                   = (known after apply)
          + mac_address           = (known after apply)
          + network_id            = "network-1016"
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.
 
yes 를 입력하면, 위의 내용이 승인되어 위의 작성한 내용으로 상태를 변경한다.

 

배포가 성공하면, TEMPLATE 으로 복제 배포가 완료된다.