Terraform là gì ? Tại sao DevOps cần phải biết.

Chắc hẳn các bạn DevOps cũng như developer hay Solution Architect đã từng nghe qua và làm việc với terraform. 

Vậy terraform là gì ? 

Terraform là công cụ mã nguồn mở của công ty HashiCorp, công ty này theo mình nhớ thì có nhiều sản phẩm mã nguồn mở cho anh em DevOps xài như : Consul, Packer, Vargant, …. 

Terraform chưa phải là ngôn ngữ mà theo mình thì terraform có dạng theo script language hoặc nó là configuration language. Scripting language như chúng ta biết là : Bash script, Powershell, python script, perl script, ….. 

Terraform là theo dạng configuration language hơn là một scripting language. Nó được định nghĩa là : 

 HashiCorp Configuration Language (HCL) .

Theo minh thấy thì terraform hiện nay các công ty đang cần nhiều và có xu hướng chuyển sang dùng terraform bởi vì : 

+ Terraform hỗ trợ nhiều cloud platform như : AWS amazon web service, Azure Microsoft, Google CLoud và cả như VMWare, Digital Ocean,…. 

+ Cấu trúc đơn giản, có thể lên copy trên terraform.io là có thể chạy được, nhưng phức tạp hơn khi bạn sử dụng module cho terraform. 

+ Terraform liên tục được update version và hiện tại version của terraform là : 1.0 

+ Terraform là IaC hỗ trợ mạnh mẽ các cloud và tích hợp với nhiều công cụ CI/CD.

+ Có cộng đồng người sử dụng lớn. …  

…. và còn nhiều ưu điểm mà mình chưa khám phá ra hết nữa 😀 

Thông thường khi chạy terraform thì bạn cần chạy 3 câu lênh sau : 

1. terraform init : cài đặt các module trong code của bạn. 

2. terraform plan : vừa check xem là code có bị lỗi gì không ? cấu trúc code có sai không ? liệt kê các công việc cho việc deploy ra như : thêm vào cái gì, thay đổi cái gì và xóa (destroy) cái gì. 

3. terraform apply : là phần deploy code của bạn lên môi trường.

Trái tim chính của terraform là file : main.tf , file này là trung tâm định nghĩa các resource, provider, … gọi là các block. 

Ví dụ một file main.tf như sau: 

terraform { required_providers { aws = { source = “hashicorp/aws” version = “~> 3.27” } }
required_version = “>= 0.14.9”}
provider “aws” { profile = “default” region = “us-west-2”}
resource “aws_instance” “app_server” { ami = “ami-830c94e3” instance_type = “t2.micro”
tags = { Name = “ExampleAppServerInstance” }}

Trong đó các block như terraform, provider, resource định nghĩa các version của terraform yêu cầu là version nhiêu ? module cần cài để chuẩn bị deploy lên một cloud là cloud nào. 

Các block khác khai báo những giá trị cần thiết khác. 

Khi bạn deploy 1 terraform lần đầu tiên thì nó ghi lại trong 1 file state, bạn có thể để file state này chổ nào đó an toàn, vì khi lần deploy thứ 2 terraform sẽ dựa vào deploy trước đó để xem có thêm, xóa, thay đổi gì không so với là trước đó. 

Trong khi làm thì mình hay để file này trên S3 bucket của AWS hoặc blob của Azure. 

Bạn có thể xem  state bằng câu lệnh: terraform state list 

 Và còn rất nhiều câu lệnh nữa mình sẽ nói trong bài sau, …