เกร่น ทำไม ต้อง terraform ด้วยความสามารถของมัน คือการ จัดการ Infrastructure ให้อยู่ใน รูปแบบ code (IaC) พูดง่ายๆ ก็คือ ทำให้ การจัดการ พวก Infra ให้อยู่ใน ภาษาที่ โปรแกรมเมอร์ เข้าใจง่ายๆ อีกจุดที่ลองใช้ เพราะ ไปเห็น เรื่อง Zero Downtime Updates Terraform Zero Downtime
Terraform Digital Ocean
How to Upload SSH Public Keys to a DigitalOcean Account :: DigitalOcean Product Documentation
- main.tf //จะเป็น file หลักที่จะมีการ สร้าง droplet หรือ จัดการ resource ต่างๆ
- variables.tf // ที่ๆ เราประกาศตัวแปร ไว้ใช้ ใน main.tf
ส่วนของ Provider ที่ใช้
provider "digitalocean" {
token = "$ {var.do_token}"
}
ส่วน resource
resource "digitalocean_droplet" "< name_resource >" {
....
....
....
}
ส่วนแรก จะเป็นส่วน จัดการ droplet หรือ instance
resource "digitalocean_droplet" "droplet" {
name = "$ {var.droplet_name}"
image = "$ {var.droplet_image}"
region = "$ {var.droplet_region}"
size = "$ {var.droplet_size}"
private_networking = false
ssh_keys = [ "$ {var.ssh_fingerprint}" ]
....
....
}
ส่วนที่ 2 อาจจะเป็น ส่วนการ จัดการภายใน droplet ที่สร้างมา
provisioner "remote-exec" {
connection {
type = "ssh"
private_key = "$ {file("~/.ssh/id_rsa")}" // ที่เก็บ private key ที่เราเอา public ไปพวกไว้ ใน cloud provider ต่างๆ
user = "root" // user ที่จะทำการ remote ไป
timeout = "2m"
host = "$ {digitalocean_droplet.droplet.ipv4_address}" // ip ที่ได้หลังการ สร้าง droplet
}
inline = [
"export PATH=$PATH:/usr/bin",
"sudo apt-get update",
"sudo apt-get install nginx -y",
]
}
variable "do_token" {}
variable "pub_key" {}
variable "pvt_key" {}
variable "ssh_fingerprint" {}
variable "droplet_name" {}
variable "droplet_size" {}
variable "droplet_image" {}
variable "droplet_region" {}
$ terraform init
$ terraform plan
เมื่อ เสร็จ จะได้ ไฟล์มาอีกตัวนึง ชื่อว่า terraform.tfplan เพื่อเป็นการ บันทึก โครงสร้างที่เราทำไว้
$ terraform apply
$ terraform destoy
หลักการคร่าวๆ จะเป็นการ destroy จาก plan ที่สร้างไว้