Terraform with Openstack

ใน Tutorials นี้จะเป็นการใช้ Terraform ในการสร้าง instance สำหรับผู้ที่ไม่เคยใช้ Terraform ในการทำ โดยจะเริ่ม Guide ตั้งเเต่สิ่งที่ต้องเตรียมก่อนสร้าง(Prerequisites) การหา data เเละ Resource ที่จำเป็น

Prerequisites

  • มี instance หรือ Devices ที่ติดตั้ง Terraform (How to install)

  • การกำหนด Provider (OpenStack Provider)

  • Data ที่ต้องใช้ใน Terraform (สามารถหาได้จาก space.nipa.cloud)

    • Provider

      1. username and password : นำมาจากที่ผู้ใช้กรอกเข้าเว็ป portal

      2. tenant_id or tenant_name: เอาไว้ระบุ project ที่เราจะใช้งาน Terraform สามารถหาได้จาก project_id หรือ project_name

      3. Terraform version : รองรับversion >= 1.8.4

      4. Openstack version : รองรับversion ~> 2.0.0

      5. auth_url : ต้องใช้ url นี้ https://identity-api.nipa.cloud ในการ Authentication

      6. region : เลือกพื้นที่ หรือ เขตในการสร้าง instance

    • Instance

      1. image_id หรือ image_name : ใช้สำหรับกำหนด OS ให้กับ instance

      2. flavor_id หรือ flavor_name : ใช้สำหรับกำหนด Machine Type ให้กับ instance

      3. availability_zone : ระบุพื้นที่ที่กำลังใช้งาน

        • NCP-BKK

        • NCP-BKK2

        • NCP-NON

        • NCP-KKN

      4. key_pair : จำเป็นต้องสร้าง key pair ก่อนจึงจะนำไปใช้งานได้

        1. ซึ่งเมื่อสร้างเสร็จเเล้วจะได้ไฟล์ .pem สามารถใช้ remote เข้า instance ด้วยคำสั่ง

        ssh -i [target = pathfile] username@hostname

      5. security_groups : สามารถระบุชื่อ security group เพื่อนำมาใช้ได้

    • Network

      1. network_id : เป็น id networkเเต่ละตัว ซึ่งสามารถนำไปใช้ในการสร้าง port เเละ subnet

      2. pool : เป็น External network ที่เป็น public ของเเต่ละ AZ ที่เราสามารถนำมาใช้สร้าง floating ip ใน Terraform

      3. port_id : id port ของ instance ตัวนั้นๆ

วิธีการสร้าง instance

  1. สร้างไฟล์ openstack_provider.tf

touch openstack_provider.tf
  1. เเก้ไขไฟล์ openstack_provider.tf ดังนี้

# Define required providers   #กำหนด Provider สำหรับใช้งาน
terraform {
  required_version = ">= 1.8.2" 
  required_providers {
    openstack = {
      source  = "terraform-provider-openstack/openstack"
      version = "~> 2.0.0"
    }
  }
}

# Configure the OpenStack Provider
provider "openstack" {
  user_name   = "xxxxxx"  #user name ใช้ user เดียวกันกับที่ login ใน portal
  password    = "xxxxxx"   #password ใช้ password เดียวกันกับที่ login ใน portal
  tenant_name     = "xxxxxx"   #เป็น ID ของ tenant หากเว้นไว้จะใช้จากตัวเเปร OS_PROJECT_NAME ของ environment
  auth_url      = " https://identity-api.nipa.cloud"
  region        = "NCP-TH"  #เขตหรือพื้นที่ใช้สำหรับสร้างตัว instance 
}

Note : สามารถอ่านข้อมูลเพิ่มเติมได้ที่ openstack provider

  1. ใช้คำสั่ง terraform init เพื่อเริ่มใช้งาน terraform เป็นขั้นตอนแรกที่สำคัญในการเริ่มต้นใช้งาน Terraform เนื่องจากมันจะจัดเตรียมสภาพแวดล้อมให้พร้อมสำหรับการดำเนินการคำสั่ง Terraform อื่น ๆ เช่น terraform plan หรือ terraform apply

terraform init

เมื่อ init สำเร็จจะปรากฎ ผลลัพธ์ดังรูป

folder .terraform และ file .terraform.lock.hcl ที่เกิดขึ้นจากการใช้คำสั่ง terraform initเมื่อทำการ init เรียบร้อย ก็จะสามารถเพิ่ม resource ต่างๆ เพื่อใช้จัดการ infrastructure ด้วย terraform ได้

  1. สร้างไฟล์ ที่ชื่อว่า compute_instance.tf

touch compute_instance.tf
  1. ทำการเเก้ไขไฟล์ compute_instance.tf

resource "openstack_networking_port_v2" "port_for_test" {
  name       = "openstack_networking_floatingip_associate_v2_port"
  network_id = "{Network_id}" # network id
}
resource "openstack_compute_instance_v2" "myinstance" {
  name            = "myinstance"   #ชื่อของ instance
  flavor_id       = "{flavor_id}" #ใส่ชื่อ key pair ที่ generate จาก Portal
  key_pair        = "my_key_pair_name"   #ใส่ชื่อ key pair ที่ generate จาก Portal
  security_groups = ["default"]
  availability_zone = "NCP-BKK" #สามารถเลือก availability_zone ได้

  block_device {
    uuid                  = "af3ea4e9-f664-4801-9b1a-59aa3c206342"
    source_type           = "image"
    volume_size           = 10
    boot_index            = 0
    destination_type      = "volume"
  }

  network {
    port = openstack_networking_port_v2.port_for_test.id
  }
}

Note : สามารถอ่านข้อมูลเพิ่มเติมได้ที่ openstack_compute_instance_v2 , openstack_networking_port_v2

  1. ใช้คำสั่ง terraform plan เพื่อตรวจสอบ script เเละดูว่ามีการเปลี่ยนแปลงใดจะเกิดขึ้นเมื่อใช้คำสั่ง terraform apply

terraform plan
  1. ใช้คำสั่ง terraform apply เพื่อสร้าง instance

terraform apply

หลังจากใช้คำสั่ง terraform จะถามว่าต้องการ perform action หรือไม่ ถ้าต้องการให้พิมพ์ yes ถ้าไม่ต้องการให้พิมพ์ no หากสร้าง instance สำเร็จจะได้ผลลัพธ์ดังรูป

โดย instance ที่สร้างจะปรากฎในหน้า space.nipa.cloud ที่หัวข้อ COMPUTE > Instances

การ attach floating ip เข้ากับ instance

  1. สร้างไฟล์ openstack_networking_floatingip.tf

touch openstack_networking_floatingip.tf
  1. เเก้ไขไฟล์ openstack_networking_floatingip.tf

resource "openstack_networking_floatingip_v2" "floatip_1" {
  pool = "Standard_Public_IP_Pool_NON"  #ให้กรอกชื่อของ pool ที่มีอยู่ โดยจะต้องอยู่ใน AZ เดียวกัย Instances
}
  1. สร้างไฟล์ openstack_networking_floatingip_associate.tf

touch openstack_networking_floatingip_associate.tf
  1. เเก้ไขไฟล์ openstack_networking_floatingip_associate.tf

resource "openstack_networking_floatingip_associate_v2" "floating_ip_associate" {
  floating_ip = openstack_networking_floatingip_v2.floatip_1.address    #เป็นการนำ floating ip จาก resource ในข้อสองมาใส่
  port_id     = openstack_networking_port_v2.port_for_test.id  
}
  1. ใช้คำสั่ง terraform plan

terraform plan
  1. ใช้คำสั่ง terraform apply เพื่อสร้าง floating ip เเละผูกเข้ากับ instance

terraform apply

หลังจากใช้คำสั่ง terraform จะถามว่าต้องการ perform action หรือไม่ ถ้าต้องการให้พิมพ์ yes ถ้าไม่ต้องการให้พิมพ์ no

หลังจากใช้คำสั่งเเล้วจะปรากฎผลลัพธ์ ดังรูป

เมื่อตรวจสอบ Instance ในหน้า space.nipa.cloud จะพบว่า Instance จะมี External Ip ที่ทำให้ instance สามารถเข้าถูกเข้าถึงได้จากภายนอก

วิธีการลบ Instance

terraform destroy คำสั่งสำหรับลบ infrastructure ที่ถูกสร้างขึ้นทั้งหมดที่ถูกสร้างขึ้นด้วยไฟล์ .tf ใน folder นั้นๆ

terraform destroy

หลังจากใช้คำสั่ง terraform จะถามว่าต้องการ perform action หรือไม่ ถ้าต้องการ ให้พิมพ์ yes ถ้าไม่ต้องการ ให้พิมพ์ no

จะได้ผลลัพธ์ดังรูป

Last updated