ကျွန်တော်တို့ terraform ကို သုံးတဲ့အခါမှာ provisioners တွေက အမြဲလိုလို သုံးရလေ့ရှိပါတယ်။ terraform provisioner ဆိုတာက ကျွန်တော်တို့ရဲ့ local ဒါမှမဟုတ် remote စက်ပေါ်မှာ action တွေ scripts တွေကို execute လုပ်ဖို့သုံးချင်တာပါ။ ဒီနေရာမှာ local ဆိုတာ terraform ကို run နေတဲ့ ကျွန်တော်တို့ရဲ့ machine ဖြစ်ပြီး remote ဆိုတာကတော့ terraform နဲ့ provision လုပ်လို့ရလာတဲ့ resource တွေကိုဆိုလိုတာပါ။
Provisioners Type
အဓိက အားဖြင့် Provisioner အမျိုးအစား နှစ်ခုရှိပါတယ်။
- Generic Provisioners
- Vendor Provisioners
provisioners တွေအကြောင်းကိုမရှင်းခင်မှာ 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 တွေကို သတ်မှတ်ပေးရပါမယ်။
1provisioner "file" {
2 source = "conf/myapp.conf"
3 destination = "/etc/myapp.conf"
4
5 connection {
6 type = "ssh"
7 user = "root"
8 password = "${var.root_password}"
9 host = "${var.host}"
10 }
11}The self Object
provisioner ရဲ့ connection block ကိုသတ်မှတ်တဲ့အခါမှာ parent resource ရဲ့ attribute ကို name နဲ့ ပြန်ခေါ်မသုံးပဲ self-object နဲ့သုံးပါတယ်။ ဥပမာ - ec2 resource ရဲ့ public IP ကို သတ်မှတ်ဖို့ဆို self.public_ip ဆိုပြီးသတ်မှတ်နိုင်ပါတယ်။
File Provisioner
File provisioner ဆိုတာ အလွယ်ပြောရရင်တော့ local machine ကနေ remote ကို files တွေကို copy လုပ်ဖို့သုံးတာဖြစ်ပါတယ်။ source နဲ့ destination ဆိုပြီးသတ်မှတ်ပေးရပါတယ်။ source ကတော့ local machine က copy ကူးမယ့် file ရဲ့ path ဖြစ်ပြီး destination ကတော့ remote machine က path ဖြစ်ပါတယ်။
1provisioner "file" {
2 source = "conf/myapp.conf"
3 destination = "/etc/myapp.conf"
4
5 connection {
6 type = "ssh"
7 user = "root"
8 password = "${var.root_password}"
9 host = "${var.host}"
10 }
11}local-exec provisioner
local-exec provisioner ကတော့ terraform နဲ့ resources တွေ create ပြီးတဲ့အခါမှာ ကိုယ့်ရဲ့ local machine ကနေ command တွေကို execute လုပ်ဖို့အတွက်သုံးတာဖြစ်ပါတယ်။ ဥပမာ - kubernetes cluster တွေကို kubectl နဲ့ သုံးတာမျိုးဖြစ်ပါတယ်။ သူ့မှာတော့ connection block သတ်မှတ်ပေးဖို့မလိုပါဘူး။
1resource "aws_instance" "web" {
2 # ...
3
4 provisioner "local-exec" {
5 command = "echo ${self.private_ip} >> private_ips.txt"
6 }
7}remote-exec provisioner
terraform နဲ့ resource တွေကို create လုပ်ပြီးတဲ့အခါမှာ အဲ့ဒီ resource မှာ တစ်ခုခုကို execute လုပ်ဖို့သုံးပါတယ်။ ဥပမာ - configuration management တွေ run ဖို့ bash scripts တွေ run ဖို့အတွက်သုံးနိုင်ပါတယ်။
1resource "aws_instance" "web" {
2 # ...
3
4 # Establishes connection to be used by all
5 # generic remote provisioners (i.e. file/remote-exec)
6 connection {
7 type = "ssh"
8 user = "root"
9 password = var.root_password
10 host = self.public_ip
11 }
12
13 provisioner "remote-exec" {
14 inline = [
15 "puppet apply",
16 "consul join ${aws_instance.web.private_ip}",
17 ]
18 }
19}destroy-time provisioners
ပုံမှန်အားဖြင့်ဆို provisioner တွေက resource တွေကို creation လုပ်ပြီးတဲ့အခါမှာ run လုပ်တာပါ။ ဆိုတော့ destroy-time ဆိုတော့ရှင်းပါတယ်။ resource တွေကို terraform destroy နဲ့ destroy လုပ်ချင်တဲ့အခါမျိုးမှာ သုံးဖို့ပါ။ provisioner block မှာ when = destroy ဆိုပြီးသတ်မှတ်ပေးရင်ရပါတယ်။
1resource "aws_instance" "web" {
2 # ...
3
4 provisioner "local-exec" {
5 when = destroy
6 command = "echo 'Destroy-time provisioner'"
7 }
8}
9 failure behavior
ပုံမှန်အားဖြင့် provisioner error တက်ပြီး fail သွားရင် terraform apply ကလည်း fail ဖြစ်သွားမှာပါ။ on_failure = continue ဆိုတာက provisioner fail သွားလည်း terraform apply ကဆက်လက်အလုပ်လုပ်သွားမှာပါ။
1resource "aws_instance" "web" {
2 # ...
3
4 provisioner "local-exec" {
5 command = "echo The server's IP address is ${self.private_ip}"
6 on_failure = continue
7 }
8}ဒီလောက်ဆို provisioners တွေအကြောင်းကိုနားလည်မယ့်လို့ထင်ပါတယ်။ အဆင်ပြေကြပါစေခင်ဗျာ။ အဆုံးထိဖတ်ပေးကြလို့ ကျေးဇူးတင်ပါတယ်ခင်ဗျာ
Discussion
Join the conversation
How do you feel about this article?
Comments
Sign in to join the conversation
Sign in to be the first to comment!
Share Your Article
Share with your professional network
Recent Articles

AWS - Application Load Balancer
Elastic Load Balancing (ELB) ELB ဆိုတာကတော့ request တွေကို တစ်နေရာတည်းမှ လက်ခံကာ Amazon EC2 instances၊ containers, etc.....

Terraform Day 3: Benefits of Terraform State
Terraform ကိုလေ့လာ တဲ့အခါ ကျွန််တော်တို့ရဲ့ Project Folder ထဲမှာ terraform.tfstate ဆိုတဲ့ ဖိုင်လေးကို တွေ့ဖူးကြပါလိမ့်မယ...

Terraform Day 2: Essential IaC Principles You Must Know
မနေ့ကတော့ Terraform အကြောင်း အကြမ်းဖျင်း Concept ကို ပြောပြခဲ့ပြီးပြီဆိုတော့ ဒီနေ့မှာတော့ Terraform ကို Professional ကျက...

TCP/IP Protocol
အားလုံးပဲမင်္ဂလာပါ။ ဒီနေ့ ကျွန်တော်တို့ TCP/IP Protocol အကြောင်း ဆွေးနွေးသွားပါမယ်။ ပထမဆုံးအနေနဲ့ TCP/IP ရဲ့ History လေး...

Terraform Day 1: Introduction to IAC and Terraform
ကျွန်တော်တို့ cloud အကြောင်း စပြောကြပြီဆိုရင် အရင်ဆုံး ခေါင်းထဲရောက်လာတာ Console ထဲဝင်၊ UI ကနေ ခလုတ်လေးတွေ လိုက်နှိပ်ပြီ...

