mengenal dan belajar terraform untuk gcp pada linux

0
633
terraform aws sekolahlinux

halo sobat sekolahlinux, kali ini saya akan membuat artikel tentang cara penggunaan template terraform untuk membuat compute engine pada google cloud, nah buat yang baru baca artikel ini ada baiknya kalian membaca tutorial tentang instalasi terraform pada link

pertama kita install dulu terraform pada linux os yang kita gunakan, disini saya menggunakan linux ubuntu 16.04

download package binary terraform terbaru di sini https://www.terraform.io/downloads.html

wget https://releases.hashicorp.com/terraform/0.11.7/terraform_0.11.7_linux_amd64.zip

jika sudah di download extract package nya

unzip https://releases.hashicorp.com/terraform/0.11.7/terraform_0.11.7_linux_amd64.zip

letakkan file binary terraform dan pindahkan hasil extract ke foder /usr/local/bin/

mv terraform /usr/local/bin/

oke sampai sini proses installasi sudah selesai sekarang kita akan masuk ke pembahasan bagaimana cara menggunakan terraform juga struktur layout filenya.

pertama kita akan melihat struktur file terraform yang saya gunakan yang ada dalam folder /home/ubuntu/terraform/

.
├── terraform-google-compute
    ├── modules
    │   ├── compute-engine-ip
    │   │   ├── main.tf
    │   │   ├── outputs.tf
    │   │   └── variables.tf
    │   └── compute-engine-noip
    │       ├── main.tf
    │       ├── outputs.tf
    │       └── variables.tf
    ├── pubkey
    │   └── id_sekolahlinux.pub
    ├── README.md
    └── sekolahlinux-terraform
        ├── credentials
        │   └── sekolahlinux.json
        ├── main.tf
        └── provisioning
            └── startup_script.sh

pada layout file diatas jelas sekali kalau saya membuat feature google compute engine di gcp menjadi sebuah module, kenapa harus dibuat module, agar jika kedepannya ada project untuk membuat template terraform lagi saya bisa menggunakan module tersebut, tanpa harus panjang-panjang ngetik lagi, nah berikut dibawah ini isi dari tiap file diatas

pada gcp saya membuat module compute menjadi 2, yang satu module compute yang menggunakan ip public dan yang satunya lagi compute tanpa public ip, perbedaannya hanya pada baris paramater `access_config {}`, jadi jika kalian tidak ingin menggunakan public ip paramater tersebut di comment namun jika kalian ingin menggunakan ip public paramater tersebut di uncomment untuk detailnya seperti dibawah ini ./terraform-google-compute/modules/compute-engine-ip/main.tf

##################
##COMPUTE ENGINE
##################
resource "google_compute_instance" "sekolahlinux" {
  count	       = "${var.count_compute}"
  name         = "${format("%s-%d", var.compute_name, count.index + var.count_start)}"
  machine_type = "${var.compute_type}"
  zone         = "${element(var.compute_zones, count.index)}"

  tags = ["${var.tags_network}"]

  boot_disk {
    initialize_params {
      image = "${var.images_name}"
      size  = "${var.size_root_disk}"
      type  = "${var.type_root_disk}"
    }
  }

  network_interface {
    subnetwork = "sekolahlinux1"
    
    # erase \\ on access_config if you want use public ip
    access_config {}
  }

  # Enable if you want use metadata
  metadata {
    sshKeys = "${var.gce_ssh_user}:${file(var.pub_key_file)}"
  }

  # Enable if you want use labels
  labels = "${var.compute_labels}"
    
  
  metadata_startup_script = "${file(var.startup_script)}"

  scheduling {
    on_host_maintenance = "MIGRATE"
    automatic_restart   = "true"
  }
}

lalu pada file ./terraform-google-compute/modules/compute-engine-ip/outputs.tf isinya seperti dibawah

output "private_ip" {
  description = "list private ip on compute instance"
  value       = ["${google_compute_instance.sekolahlinux.*.network_interface.0.network_ip}"]
}

output "public_ip" {
  description = "list private ip on compute instance"
  value       = ["${google_compute_instance.sekolahlinux.*.network_interface.0.access_config.0.nat_ip}"]
}

lalu pada file ./terraform-google-compute/modules/compute-engine-ip/variables.tf isinya seperti dibawah

variable "gce_ssh_user" {
        default = ""
}

variable "pub_key_file" {
        default = ""
}

variable "network_interface" {
        default = {}
}

variable "compute_name" {
	default = ""
}

variable "count_compute" {
	default = ""
}

variable "count_start" {
        default = ""
}

variable "compute_labels" {
  type    = "map"
  default = {}
}

variable "compute_zones" {
        default = []
}

variable "tags_network" {
	default = []
}

variable "images_name" {
	default = ""
}

variable "size_root_disk" {
	default = ""
}

variable "type_root_disk" {
	default = ""
}

variable "compute_type" {
	default = ""
}

variable "startup_script" {
	default = ""
}

 

selanjutnya mari kita lihat isi file dari template sekolahlinux-terraform

pada file ./terraform-google-compute/sekolahlinux-terraform/main.tf

provider "google" {
  credentials = "${file("./credentials/sekolahlinux.json")}"
  project     = "sekolahlinux-110891"
  region      = "asia-southeast1"
}

############################################################################
############################################################################
############################################################################

module "compute_engine" {
# pilih module compute-engine-noip jika kamu ingin instance/compute yang kamu buat tanpa public ip
# pilih module compute-engine-ip jika kamu ingin instance/compute yang kamu buat mempunyai public ip
# source = "../modules/compute-engine-noip/"
  source = "../modules/compute-engine-ip/"

  count_compute	= 3
  count_start	= 1
  compute_name	= "java-prod"
  compute_type	= "n1-standard-1"
  compute_zones	= ["asia-southeast1-a", "asia-southeast1-b", "asia-southeast1-c"]
  
  tags_network		= ["allow-icmp", "allow-ssh"]
  images_name		= "ubuntu-1604-lts"
  size_root_disk	= 100
  type_root_disk	= "pd-standard" 			//pd-standard or pd-ssd
  startup_script	= "./provisioning/startup_script.sh"
  pub_key_file          = "../pubkey/id_sekolahlinux.pub"
  gce_ssh_user          = "ubuntu"

  compute_labels = {
    "createdby" = "terraform"
    "environment" = "development"
  }
}

############################################################################
############################################################################
############################################################################

output "compute_private_ip" {
  description = "List of private IP addresses assigned to the instances, if applicable"
  value       = "${module.compute_engine.private_ip}"
}

output "compute_public_ip" {
  description = "List of private IP addresses assigned to the instances, if applicable"
  value       = "${module.compute_engine.public_ip}"
}

 

penjelasan pada template sekolahlinux-terraform

module "compute_engine" {
# pilih module compute-engine-noip jika kamu ingin instance/compute yang kamu buat tanpa public ip
# pilih module compute-engine-ip jika kamu ingin instance/compute yang kamu buat mempunyai public ip
# source = "../modules/compute-engine-noip/"
  source = "../modules/compute-engine-ip/"

  count_compute	= 3
  count_start	= 1
  compute_name	= "java-prod"
  compute_type	= "n1-standard-1"
  compute_zones	= ["asia-southeast1-a", "asia-southeast1-b", "asia-southeast1-c"]
  
  tags_network		= ["allow-icmp", "allow-ssh"]
  images_name		= "ubuntu-1604-lts"
  size_root_disk	= 100
  type_root_disk	= "pd-standard" 			//pd-standard or pd-ssd
  startup_script	= "./provisioning/startup_script.sh"
  pub_key_file          = "../pubkey/id_sekolahlinux.pub"
  gce_ssh_user          = "ubuntu"

  compute_labels = {
    "createdby" = "terraform"
    "environment" = "development"
  }
}

didalam terraform terdapat 3 type variable yaitu strings, maps, lists, boolean detailnya kamu bisa baca di link type_variable_terraform , berikut dibawah ini paramater yang harus kamu rubah beserta penjelasannya pada template terraform untuk pembuatan instance di gcp

  • count_compute

variable count_compute digunakan untuk menentukan berapa jumlah instance atau vm yang ingin kamu buat

  • count_start

variable count_start digunakan untuk menentukan dari no berapa nama vm instance yang kita buat dimulai, misal diatas saya memberikan value 1 berarti nanti penamaan akan dimulai dari no 1 contoh java-prod-1 sampai java-prod-3 namun jika saya memberikan value 3 maka akan dimulai dari java-prod-3 sampai java-prod-5

  • compute_name

variable compute_name digunakan untuk menentukan nama dari instance yang akan kita buat

  • compute_type

variable compute_type digunakan untuk menentukan spesifikasi instance yang akan kita set, kalau di aws namanya instance type, kalian bisa melihat list typenya di link berikut machine types

  • compute_zones

varibale compute_zones digunakan untuk menentukan di zone mana saja compute instance yang akan kamu buat, detail zones nya kamu bisa lihat di link berikut regions & zones

  • tags_network

variable tags_network digunakan untuk memberikan tags yang nantinya digunakan untuk keperluan penentuan firewall yang lebih spesifik ataupun untuk keperluan nat gateway jika kalian menggunakan type network nat instance

  • subnet_network

variable subnet_network digunakan untuk menentukan subnet dari network vpc mana yang akan digunakan pada instance / vm yang kita buat, ingat isi value pada variable ini dengan subnet bukan network

  • images_name

variable images_name digunakan untuk menentukan images atau OS apa yang akan kita gunakan pada sebuah instance atau vm yang akan kita buat, untuk list public image kamu bisa lihat di link berikut public images

  • size_root_disk

variable size_root_disk digunakan untuk menentukan berapa besar size root storage yang akan digunakan pada sebuah instance atau vm

  • type_root_disk

variable type_root_disk digunakan untuk menentukan type dari root disk yang akan kita gunakan pada vm atau instance yang akan kita buat, disini hanya bisa di isi value **pd-standard** atau **pd-ssd**

  • startup_script

variable startup_script digunakan untuk menentukan file yang berisikan sheel command yang akan dieksekusi ketika instance tersebut berhasil dibuat dan jalan saat pertama kali

  • pub_key_file

variable pub_key_file digunakan untuk menentukan pubkey ssh mana yang akan di inject atau dipasang ke instane yang akan kita buat di gcp

  • gce_ssh_user

variable gce_ssh_user digunakan untuk menentukan di user ssh apa pubkey akan di inject atau di pasang, jika user yang kamu isi belum terdaftar di os tersebut maka akan dibuatkan user ssh pada vm linux tersebut

  • compute_labels

variable compute_labels digunakan untuk menentukan labels yang akan digunakan pada instance yang akan kita buat, kalau di aws bisa juga disebut tag/tags

 

How to run terraform

create managing service account keys

detailnya kalian bisa melihatnya disini dan download dalam bentuk json

jika sudah download json nya masukan kedalam ./terraform-google-compute/sekolahlinux-terraform/credentials pada paramater dibawah saya merubah nama json nya menjadi sekolahlinux.json

provider "google" {
  credentials = "${file("./credentials/sekolahlinux.json")}"
  project     = "sekolahlinux-110891"
  region      = "asia-southeast1"
}

jika sudah jalankan perintah dibawah ini dari dalam folder `./terraform-google-compute/sekolahlinux-terraform/`

terraform init
jalankan perintah terraform init untuk melakukan download plugin terraform google cloud dan juga melakukan mapping terhadap module

terraform plan
jalankan perintah terraform plan untuk melihat/mereview template terraform sebelum dilakukan implementasi di google cloud

terraform apply
jalankan perintah terraform apply untuk mengeksekusi template terraform dan mengimplementasikan ke google cloud

terraform destroy
jalankan perintah terraform destroy untuk destroy seluruh instance google cloud yang kalian buat menggunakan template terraform google cloud

 

Untuk lebih detailnya kalian bisa mengunduh filenya di github sekolahlinux

untuk download module melalui terraform module bisa ke link dibawah

lalu untuk detail functions yang digunakan pada terraform kalian bisa lihat di sini

jika ada yang ingin kalian tanyakan silahkan comment dibawah atau comment di github repo sekolahlinux ya… terimakasih 🙂