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 으로 복제 배포가 완료된다.

 

순서 

 

1. 테라폼 CLI 설치

Install | Terraform | HashiCorp Developer

 

Install | Terraform | HashiCorp Developer

Explore Terraform product documentation, tutorials, and examples.

developer.hashicorp.com

 

자신의 cpu 에 맞는 걸 다운로드. (인텔꺼면 위에 암드꺼면 아래로)

압축 해제하면, 아래 파일이 나오는데

다운로드 후 압축 해제
 
 

시스템 환경 변수를 잡아주어야한다.

 

일단, 저 파일을 C -> Terraform 폴더를 만들어서 넣어줬다.

 

윈도우 키를 누르고, 환경이라고 쳐보면, 시스템 환경 변수 편집이 있다.

 

환경 검색 -> 시스템 환경 변수 편집 클릭

 

클릭
더블 클릭
압축푼 파일 위치 폴더까지 찾아서 선택

 

 

재부팅 후

 

cmd , powershell 등에서 terraform 이라고 쳤을 때, 아래 처럼 나오면 환경변수가 정확하게 잡힌것임.

2. 편집기 설치 (VSCODE)
 

편집기 vscode 를 설치해보자.

 

Download Visual Studio Code - Mac, Linux, Windows

 

Download Visual Studio Code - Mac, Linux, Windows

Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows. Download Visual Studio Code to experience a redefined code editor, optimized for building and debugging modern web and cloud applications.

code.visualstudio.com

 

설치후 실행

Terminal 클릭 ! -> 아래 터미널 창이 열리면, terraform 입력 해보기

 
 

참고하면 좋은 영상

https://www.youtube.com/watch?v=3qSpwqckvXQ

테라폼이란?

 

테라폼(Terraform)은 하시코프(Hashicorp)에서 오픈소스로 개발중인 클라우드 인프라스트럭처 자동화를 지향하는 IaC 도구 입니다.

 

IaC란?

코드로서의 인프라스트럭처(Infrastructure as Code, IaC)라는 의미입니다.

코드로 인프라를 관리한다는 의미인데, 인프라에 해당하는 부분은 생각보다 많다.

 

대표적인 장점은 

 

작성의 용이성

재사용성

유지보수 

 

인프라?

서버, 미들웨어, 서비스 등이 있다. 

서비스를 제공하는데 필요한 요소를 통틀어서 지칭한다고 이해하면 된다.

 

Terraform

테라폼은 인프라를 만들고, 변경하고, 기록하는 IaC 를 위해 만들어진 도구로써, 문법이 쉽고 사용자가 많아 자료가 많다.

.tf 의 확장자를 가지는 파일을 사용한다.

다양한 클라우드 서비스를 지원한다.

 

테라폼 구성요소

provider : 테라폼으로 생성할 인프라 종류

 

resource : 테라폼으로 실제 생성할 인프라 자원 

 

state : 테라폼을 통해 생성한 자원의 상태

 

output : 테라폼으로 만든 자원을 변수 형태로 state 에 저장하는 것

 

module : 공통적으로 활용할 수 있는 코드를 문자 그대로 모듈 형태로 정의하는 것

 

remote : 다른 경로의 state 를 참조하는 것을 말함. output 변수를 불러올 때, 주로 사용