이번 포스팅에서는 IBM Bluemix Infra. 및 다른 클라우드에 대한 단일 리소스 관리 툴인 Terraform 에 대해서 알아보도록 하겠습니다. Terraform은 오픈소스로 다양한 클라우드의 인프라 관리 및 자동화 영역에서 주목받고 있으며, IBM의 멀티 클라우드 관리 및 오케스트레이션 툴인 Cloud Automation Manager(CAM) 제품에서도 사용되고 있습니다.

Terraform 이란

Terraform은 Cloud 를 포함한 다양한 리소스에 대한 생성, 변경 및 삭제 등에 대한 관리를 코드화 시키는 ‘Infrastructure as a Code’ 개념으로 인프라스트럭처 자동화를 위한 Tool로 많이 사용되고 있습니다. 좀더 구체적으로 설명하자면, Cloud리소스의 양식이 되는 템플릿 코드를 만들고 그것을 사용하여 쉽게 Cloud 서버의 생성, 수정 및 삭제 등을 손쉽게 관리할 수 있는 도구 입니다.

아래는 Terraform에서 정의하고 있는 툴에 대한 정의 및 주요 기능입니다

Terraform 정의:
Terraform is a tool for building, changing, and versioning infrastructure safely and efficiently. Terraform can manage existing and popular service providers as well as custom in-house solutions.

Terraform 이 제공하는 주요 기능:
Infrastructure as a code
Execution Plan
Resource Graph
Change Automation

보다 자세한 내용은 Terraform 웹사이트에서 확인할 수 있습니다.
링크 : https://www.terraform.io/intro/index.html

Terraform을 사용하여 IBM Bluemix Infra. 관리하기
Terraform은 IBM Bluemix Infra.를 Provider로 지원하고 있으며, 가장 기본적인 서버 생성을 위한 방법에 대해서 알아보겠습니다.

설치하기
Terraform은 다양한 OS를 지원하고 있으며, 다운로드 페이지에서 사용자 환경에 맞는 버전을 선택해서 설치합니다.
다운로드 링크 : https://www.terraform.io/downloads.html
(*본 포스팅은 macOS Sierra 10.12.5를 바탕으로 작성되었습니다.)

다운로드 받은 ZIP 파일을 압축 해제 후 터미널에서 실행하기 쉽도록 바이너리 폴더로 복사 후 커맨드 실행이 정상적으로 되는지 확인합니다. 여기서는 간단한 –version파라미터를 사용하였습니다.

$ cp terraform /user/local/bin
$ terraform –version
Terraform v0.9.10


Terraform으로 관리하기
Terraform의 기본적인 흐름은 다음과 같습니다.
1.Template 작성
2.Execution Plan 실행(Dry run)
3.Template 실행(자원 생성)
4.결과 및 자원 생성 확인

1.Template 작성
Template 파일은 terraform 포맷 혹은 JSON을 지원하며, terraform 커맨드가 실행되는 디렉토리에서 terraform 포맷 (.tf) 혹은 JOSN 파일(.tf.json)을 검색하여 수행합니다. Terraform은 선언형(declarative)이기 때문에 최종 인프라 구성을 Terraform 파일에 선언하면 됩니다.

Terraform/Bluemix 의 디렉토리를 생성 후 Bluemix terraform 포맷(파일명.tf)을 아래와 같이 생성합니다.

# Provider를 SoftLayer로 설정
provider “softlayer”{
username = “xxxxxxxx”
api_key = “xxxxxxxx”
}

# 자원 설정
# Virtual Server 자원 생성
resource “softlayer_virtual_guest” “minsuk_vm”{
name = “VM-By-Terraform”
domain = “test.com”
image = “CENTOS_7_64”
region = “seo01”
public_network_speed = 100
cpu = 1
ram = 1024
hourly_billing = true
private_network_only = false
disks = [25]

local_disk = true
}

* 참고:보안상의 이유로 API에 대한 Credential을 파일에 저장할 수 없다면, 아래 포맷에서 Provider 포맷을 공란으로 처리 후 Credential을 환경 변수로 선언할 수 있습니다.

provider “softlayer” {}
$ export SOFTLAYER_USERNAME=Your SoftLayer username
$ export SOFTLAYER_API_KEY=Your API key

** 참고: 환경변수는 실행중인 Shell에서만 적용되며, 재부팅 혹은 터미널 재시작 시에는 동일하게 재선언해야합니다.

2.Execution Plan 실행(Dry run)
템플릿 작성이 완료되면, ‘terraform plan’을 통해 Execution Plan을 실행할 수 있습니다. 실제로 자원이 생성되진 않으며, 템플릿에 구문 오류가 있는지 그리고 추가되어야할 리소스에 대해 알수 있습니다.

$ terraform plan
Refreshing Terraform state in-memory prior to plan…
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

The Terraform execution plan has been generated and is shown below.
Resources are shown in alphabetical order for quick scanning. Green resources
will be created (or destroyed and then created if an existing resource
exists), yellow resources are being changed in-place, and red resources
will be destroyed. Cyan entries are data sources to be read.

Note: You didn’t specify an “-out” parameter to save this plan, so when
“apply” is called, Terraform can’t guarantee this is what will execute.

+ softlayer_virtual_guest.minsuk_vm
cpu: “1”
disks.#: “1”
disks.0: “25”
domain: “test.com”
hourly_billing: “true”
image: “CENTOS_7_64”
ipv4_address: “
ipv4_address_private: “
local_disk: “true”
name: “VM-By-Terraform”
private_network_only: “false”
public_network_speed: “100”
ram: “1024”
region: “seo01”

Plan: 1 to add, 0 to change, 0 to destroy.

현재 생성된 자원이 없기 때문에 Terraform plan 결과에 ‘1개’의 자원이 더 추가되어야한다는 내용을 확인할 수 있습니다.

3.Template 실행(자원 생성)
‘terraform apply’ 커맨드를 통해 실제 자원 생성을 할 수 있습니다.

$ terraform apply
softlayer_virtual_guest.minsuk_vm: Creating…
cpu: “” => “1”
disks.#: “” => “1”
disks.0: “” => “25”
domain: “” => “test.com”
hourly_billing: “” => “true”
image: “” => “CENTOS_7_64”
ipv4_address: “” => “
ipv4_address_private: “” => “
local_disk: “” => “true”
name: “” => “VM-By-Terraform”
private_network_only: “” => “false”
public_network_speed: “” => “100”
ram: “” => “1024”
region: “” => “seo01”
softlayer_virtual_guest.minsuk_vm: Still creating… (10s elapsed)
softlayer_virtual_guest.minsuk_vm: Still creating… (20s elapsed)
softlayer_virtual_guest.minsuk_vm: Still creating… (30s elapsed)
softlayer_virtual_guest.minsuk_vm: Still creating… (40s elapsed)
softlayer_virtual_guest.minsuk_vm: Still creating… (50s elapsed)
softlayer_virtual_guest.minsuk_vm: Still creating… (1m0s elapsed)
softlayer_virtual_guest.minsuk_vm: Still creating… (1m10s elapsed)
softlayer_virtual_guest.minsuk_vm: Still creating… (1m20s elapsed)
softlayer_virtual_guest.minsuk_vm: Still creating… (1m30s elapsed)
softlayer_virtual_guest.minsuk_vm: Still creating… (1m40s elapsed)
softlayer_virtual_guest.minsuk_vm: Still creating… (1m50s elapsed)
softlayer_virtual_guest.minsuk_vm: Still creating… (2m0s elapsed)
softlayer_virtual_guest.minsuk_vm: Still creating… (2m10s elapsed)
softlayer_virtual_guest.minsuk_vm: Still creating… (2m20s elapsed)
softlayer_virtual_guest.minsuk_vm: Still creating… (2m30s elapsed)
softlayer_virtual_guest.minsuk_vm: Creation complete (ID: 35728139)

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

The state of your infrastructure has been saved to the path
below. This state is required to modify and destroy your
infrastructure, so keep it safe. To inspect the complete state
use the `terraform show` command.

State path:

Terraform에서는 10초 마다 상태 확인 메세지를 출력합니다. 위의 예제에서는 기본적인 리눅스 서버가 2분 30초 에 걸쳐 생성된 것을 확인할 수 있습니다.


4.결과 및 자원 생성 확인
terraform 수행 결과는 ‘terraform show’ 커맨드를 통해 확인할 수 있습니다.

$ terraform show
softlayer_virtual_guest.minsuk_vm:
  id = 35728139
  cpu = 1
  dedicated_acct_host_only = false
  disks.# = 1
  disks.0 = 25
  domain = test.com
  hourly_billing = true
  image = CENTOS_7_64
  ipv4_address = 169.56.126.22
  ipv4_address_private = 10.178.9.155
  local_disk = false
  name = VM-By-Terraform
  private_network_only = true
  public_network_speed = 100
  ram = 1024
  region = seo01

사용자 포탈(control.softlayer.com)에서도 확인할 수 있습니다.

마지막으로 실제 생성된 자원에 SSH 접속을 통해 정상적으로 접근하여 서버에 접속합니다.

$ ssh root@10.178.9.155
The authenticity of host ‘10.178.9.155 (10.178.9.155)’ can’t be established.
ECDSA key fingerprint is SHA256:Hs99DUrDapSxMzR2A1ebpaxtgoCw/r4mixc5o3lwrmc.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘10.178.9.155’ (ECDSA) to the list of known hosts.
root@10.178.9.155’s password: 
[root@VM-By-Terraform ~]# 

다음 포스팅에서는 생성된 자원의 변경 및 terraform 버전 관리에 대해서 알아보겠습니다.

토론 참가

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다