Terraform Provisioners

ကျွန်တော်တို့ Infrastructure ကို provision လုပ်ဖို့အတွက် Terraform ကို သုံးကြတဲ့အခါမှာ provisioners တွေက အမြဲလိုလိုသုံးရလေ့ရှိပါတယ်။ provisioner ဆိုတာက ကျွန်တော်တို့ရဲ့ local ဒါမှမဟုတ် remote စက်တွေပေါ်မှာ action တွေ scripts တွေကို execute လုပ်ဖို့သုံးချင်တာပါ။ဒီနေရာမှာ local ဆိုတာ Terraform ကို run နေတဲ့ ကျွန်တော်တို့ရဲ့ machine ဖြစ်ပြီး remote ဆိုတာကတော့ Terraform နဲ့ provision လုပ်လို့ရလာတဲ့ resource တွေကိုဆိုလိုတာပါ။

Provisioners are used to execute scripts on a local or remote machine as part of resource creation or destruction. Provisioners can be used to bootstrap a resource, cleanup before destroying, run configuration management, etc.

👉 Provisioners အမျိုးအစား

ယေဘုယျအားဖြင့်တော့ Provisioner အမျိုးအစား (၂) ခုရှိပါတယ်။

  • Generic Provisioners ( file, local-exec, and remote-exec )
  • Vendor Provisioners ( chef, puppet, ansible, etc )

ကျွန်တော်ကတော့ generic provisioners တွေအကြောင်းကိုပဲ ရေးသွားမှာပါ။ ဒါဆိုအခု တစ်ခုချင်း အကြောင်းကိုရှင်းပြပါ့မယ်။ privisioner တွေအကြောင်းကိုမရှင်းခင်မှာ connection block အကြောင်းကိုအရင်ရှင်းပြပါမယ်။

👉 Connection Block အကြောင်း

file နဲ့ remote-exec provisioner တွေမှာ remote resources တွေကို access လုပ်ဖို့အတွက် connection block ထဲမှာ သတ်မှတ်ပေးကြရပါတယ်။ connection type မှာ SSH နဲ့ WinRM (၂)ခုကို support လုပ်ပါတယ်။ connection block မှာတော့ remote machine ရဲ့ host, username, private_key တွေကို သတ်မှတ်ပေးရပါမယ်။

provisioner "file" {
  source      = "conf/myapp.conf"
  destination = "/etc/myapp.conf"

  connection {
    type     = "ssh"
    user     = "root"
    password = "${var.root_password}"
    host     = "${var.host}"
  }
}

👉 The self Object

Provisioner ရဲ့ connection block ကိုသတ်မှတ်တဲ့အခါမှာ parent block ရဲ့ IP address စတာတွေကို name နဲ့ ပြန်ခေါ်မသုံးပဲ self-object နဲ့သုံးပါတယ်။ ဥပမာ - remote EC2 ရဲ့ public IP ကို သတ်မှတ်ဖို့ဆို self.public_ip ဆိုပြီးသတ်မှတ်နိုင်ပါတယ်။

👉 File Provisioner တွေအကြာင်း

File provisioners တွေဆိုတာ အလွယ်ပြောရရင်တော့ local machine ကနေ remote ကို files တွေကို copy လုပ်ဖို့သုံးတာဖြစ်ပါတယ်။ File Provisioner တွေမှာ source နဲ့ destination ဆိုပြီးသတ်မှတ်ပေးရပါတယ်။ source ကတော့ local machine က copy ကူးမယ့် file ရဲ့ path ဖြစ်ပြီး destination ကတော့ remote machine က path ဖြစ်ပါတယ်။

The file provisioner is used to copy files or directories from the machine executing Terraform to the newly created resource. The file provisioner supports both ssh and WinRM type connections.

provisioner "file" {
  source      = "conf/myapp.conf"
  destination = "/etc/myapp.conf"

  connection {
    type     = "ssh"
    user     = "root"
    password = "${var.root_password}"
    host     = "${var.host}"
  }
}

👉 Local-Exec Provisioner

Local-Exec provisioner တွေကတော့ Terraform နဲ့ resources တွေ create ပြီးတဲ့အခါမှာ ကိုယ့်ရဲ့ local machine ကနေ command တွေကို execute လုပ်ဖို့အတွက်သုံးတာဖြစ်ပါတယ်။ ဥပမာ - kubernetes cluster တွေကို kubectl နဲ့ သုံးတာမျိုးဖြစ်ပါတယ်။ သူ့မှာတော့ connection block သတ်မှတ်ပေးဖို့မလိုပါဘူး။

resource "aws_instance" "web" {
  # ...

  provisioner "local-exec" {
    command = "echo ${self.private_ip} >> private_ips.txt"
  }
}

👉 Remote-Exec Provisioner

Terraform နဲ့ resource တွေကို create လုပ်ပြီးတဲ့အခါမှာ အဲ့ဒီ resource မှာ တစ်ခုခုကို execute လုပ်ဖို့သုံးပါတယ်။ ဥပမာ - configuration management တွေ run ဖို့ bash scripts တွေ run ဖို့အတွက်သုံးနိုင်ပါတယ်။

resource "aws_instance" "web" {
  # ...

  # Establishes connection to be used by all
  # generic remote provisioners (i.e. file/remote-exec)
  connection {
    type     = "ssh"
    user     = "root"
    password = var.root_password
    host     = self.public_ip
  }

  provisioner "remote-exec" {
    inline = [
      "puppet apply",
      "consul join ${aws_instance.web.private_ip}",
    ]
  }
}

👉 Destroy-Time Provisioners

ပုံမှန်အားဖြင့်ဆို provisioner တွေက resource တွေကို creation လုပ်ပြီးတဲ့အခါမှာ run လုပ်တာပါ။ ဆိုတော့ destroy-time ဆိုတော့ရှင်းပါတယ်။ resource တွေကို terraform destroy နဲ့ destroy လုပ်ချင်တဲ့အခါမျိုးမှာ သုံးဖို့ပါ။ provisioner block မှာ when = destroy ဆိုပြီးသတ်မှတ်ပေးရင်ရပါတယ်။

resource "aws_instance" "web" {
  # ...

  provisioner "local-exec" {
    when    = destroy
    command = "echo 'Destroy-time provisioner'"
  }
}

👉 Failure Behavior

ပုံမှန်အားဖြင့် provisioner error တက်ပြီး fail သွားရင် terraform apply ကလည်း fail ဖြစ်သွားမှာပါ။ on_failure = continue ဆိုတာက provisioner fail သွားလည်း terraform apply ကဆက်လက်အလုပ်လုပ်သွားမှာပါ။

resource "aws_instance" "web" {
  # ...

  provisioner "local-exec" {
    command    = "echo The server's IP address is ${self.private_ip}"
    on_failure = continue
  }
}

ကဲ.. စာလည်း အတော်ရှည်သွားပြီ။ ဒီလောက်ဆို Terraform Provisioners တွေအကြောင်းကိုနားလည်မယ့်လို့ထင်ပါတယ်။ အဆုံးထိဖတ်ရှူပေးကြသူများအားလုံးကျေးဇူးတင်ပါတယ်။ နောက်လည်း ဒီလို sharing လေးတွေရေးသွားပါဦးမယ်။

👉 Reference

သင်ဆရာ မြင်ဆရာ ကြားဆရာများကိုလေးစားလျှက် 🙏🙏🙏

သောင်းထိုက်ဦး (UIT)



Recent Posts