Friday, November 22, 2024

[Terraform] Lesson 18 – Built-In Functions

-

1. Built-In Functions là gì?

Trong Terraform, Built-In Functions là các hàm có sẵn được sử dụng để thực hiện các tính toán và xử lý dữ liệu trong quá trình triển khai hạ tầng. Terraform cung cấp một số lượng lớn các hàm này để giúp người dùng thực hiện các tác vụ phổ biến, bao gồm mã hóa và giải mã chuỗi, xử lý thời gian, tính toán giá trị băm, định dạng số và chuỗi, truy vấn thông tin về hạ tầng và nhiều hơn nữa.

Các Built-In Functions trong Terraform có thể được sử dụng trong các khai báo của tài nguyên, biến, output và các phần khác của mã Terraform. Cú pháp sử dụng hàm bao gồm tên hàm và các đối số của nó, được đặt trong cặp dấu ngoặc đơn () và được ngăn cách bởi dấu phẩy.

Ví dụ: hàm upper được sử dụng để chuyển đổi một chuỗi thành chữ in hoa:

upper("hello world")  # Kết quả là "HELLO WORLD"

Có thể tìm hiểu thêm về các Built-In Functions trong Terraform tại trang chính thức của nó.

Cú pháp khai báo Built-In Functions trong Terraform như sau:

function_name(argument1, argument2, ...)
  • function_name: Tên của Built-In Function cần sử dụng.
  • argument1, argument2, …: Các đối số cần truyền vào hàm để thực hiện tính toán hoặc xử lý dữ liệu.

Ví dụ, để sử dụng hàm concat trong Terraform để nối hai chuỗi lại với nhau, bạn có thể sử dụng cú pháp sau:

concat("Hello", "world") # Kết quả là "Helloworld"

Chú ý rằng tên hàm phân biệt chữ hoa và chữ thường, do đó bạn cần chắc chắn sử dụng tên hàm chính xác.

2. Các lưu ý khi sử dụng Built-In Functions.

Dưới đây là các lưu ý cần lưu ý khi sử dụng Built-In Functions trong Terraform:

  • Tên hàm phân biệt chữ hoa và chữ thường: Bạn cần sử dụng tên hàm chính xác để Terraform có thể tìm thấy hàm mà bạn muốn sử dụng.
  • Sử dụng đúng kiểu đối số: Built-In Functions trong Terraform sẽ chỉ chấp nhận các kiểu đối số nhất định. Nếu bạn truyền đối số không phù hợp, hàm sẽ không hoạt động đúng cách.
  • Không thể sử dụng các biến Terraform trong các Built-In Function trong trường hợp một biến không có giá trị: Nếu bạn muốn sử dụng một biến trong một Built-In Function và biến đó có thể không có giá trị, bạn cần đảm bảo rằng biến đó đã được khởi tạo trước khi sử dụng.
  • Các hàm mặc định không có khả năng xử lý lỗi: Nếu một Built-In Function không thể xử lý đầu vào bị sai hoặc bị thiếu, hàm sẽ trả về lỗi và các thao tác khác trong file cấu hình Terraform của bạn sẽ không tiếp tục được.
  • Các hàm có thể phụ thuộc vào các tài nguyên khác: Một số Built-In Function có thể phụ thuộc vào các tài nguyên khác trong môi trường Terraform, điều này có thể gây ra sự tương phản trong quá trình xử lý.
  • Các hàm sẽ được thực thi mỗi khi bạn chạy lệnh terraform plan hoặc terraform apply: Điều này có nghĩa là nếu bạn sử dụng một hàm không hiệu quả hoặc một hàm phụ thuộc vào dữ liệu bên ngoài, bạn có thể gặp phải vấn đề khi chạy các lệnh Terraform.
  • Các hàm có thể trả về giá trị khác nhau tùy thuộc vào môi trường hoặc cấu hình Terraform của bạn: Điều này có thể gây ra sự khác biệt giữa kết quả mong đợi và kết quả thực tế trong quá trình triển khai.
  • Các hàm có thể phụ thuộc vào phiên bản của Terraform: Nếu bạn sử dụng một phiên bản cũ của Terraform, một số Built-In Functions có thể không được hỗ trợ hoặc hoạt động không đúng cách.
  • Các hàm Built-In không thể mở rộng: Terraform cung cấp một số Built-In Functions để giúp bạn xử lý các giá trị trong file cấu hình, tuy nhiên, nếu bạn muốn thực hiện các thao tác phức tạp hơn, bạn cần sử dụng các plugin hoặc kịch bản bên ngoài.
  • Các hàm Built-In không được kiểm tra lỗi tại thời điểm biên dịch: Nếu bạn sử dụng các hàm không chính xác hoặc truyền đối số không hợp lệ, lỗi sẽ không được phát hiện cho đến khi bạn chạy lệnh Terraform.
  • Terraform hỗ trợ nhiều Built-In Functions khác nhau, nên trước khi sử dụng một Built-In Function nào đó, cần đọc tài liệu của Terraform để hiểu rõ cách sử dụng và các tham số của hàm.
  • Một số Built-In Functions có thể yêu cầu sử dụng đối tượng như list, map, set… nên cần kiểm tra kiểu dữ liệu trước khi sử dụng hàm.
  • Có một số Built-In Functions chỉ hỗ trợ trên phiên bản Terraform mới nhất, vì vậy nếu sử dụng phiên bản cũ hơn có thể sẽ không có tùy chọn này.
  • Các Built-In Functions được thiết kế để hỗ trợ các hoạt động thao tác dữ liệu và xử lý trong Terraform, tuy nhiên không nên sử dụng quá nhiều Built-In Functions trong các file cấu hình, vì nó có thể làm chậm quá trình triển khai của hệ thống.
  • Nếu bạn muốn sử dụng một số hàm đặc biệt trong Terraform, bạn có thể tự định nghĩa hàm của riêng mình bằng cách sử dụng các thư viện và module được hỗ trợ bởi Terraform.
  • Một số hàm được sử dụng phổ biến trong Terraform như format, element, coalesce có thể gây ra lỗi nếu không được sử dụng đúng cách hoặc không truyền đúng tham số. Vì vậy, cần đọc tài liệu kỹ trước khi sử dụng và kiểm tra cẩn thận trước khi triển khai để tránh gây ra sự cố.
  • Terraform cung cấp một số hàm để xử lý chuỗi, ví dụ như lower, upper, trim, replace,… khi sử dụng các hàm này cần chú ý các ký tự đặc biệt trong chuỗi có thể gây ra lỗi khi xử lý.
  • Các Built-In Functions có thể được sử dụng để xử lý các giá trị trong file cấu hình Terraform. Tuy nhiên, nếu muốn xử lý dữ liệu phức tạp hơn, có thể sử dụng các ngôn ngữ lập trình như Python hoặc Go để tạo ra các script để xử lý dữ liệu.
  • Khi sử dụng các Built-In Functions trong các biểu thức điều kiện (if, for…), cần chú ý đến kiểu dữ liệu và các điều kiện logic để tránh gây ra lỗi hoặc không cho kết quả như mong đợi.
  • Có thể sử dụng các Built-In Functions để xử lý các biến đầu vào (input variables) hoặc giá trị đầu ra (output values) trong Terraform. Ví dụ, có thể sử dụng hàm coalesce để xác định giá trị mặc định cho biến đầu vào hoặc giá trị đầu ra nếu giá trị đó không được xác định.
  • Terraform có hơn 200 hàm tích hợp, tuy nhiên không nên sử dụng tất cả chúng trong cùng một module vì sẽ làm cho mã của bạn khó đọc và khó hiểu. Hãy sử dụng các hàm tích hợp một cách hợp lý để giải quyết các vấn đề cụ thể.
  • Các hàm tích hợp có thể có các tham số tùy chọn và yêu cầu các tham số được đưa ra trong một định dạng cụ thể. Hãy kiểm tra tài liệu của hàm tích hợp trước khi sử dụng để biết định dạng tham số chính xác.
  • Các hàm tích hợp có thể có các phiên bản khác nhau, vì vậy hãy sử dụng phiên bản chính xác của hàm tích hợp phù hợp với phiên bản của Terraform bạn đang sử dụng.
  • Terraform cũng cung cấp cho bạn khả năng tạo ra các hàm của riêng mình để giải quyết các vấn đề cụ thể của bạn. Tuy nhiên, hãy chú ý rằng việc tạo ra các hàm của riêng mình có thể làm cho mã của bạn phức tạp hơn và khó đọc hơn nếu bạn không sử dụng chúng một cách hợp lý.
  • Nếu bạn đang sử dụng các hàm tích hợp để xử lý dữ liệu bảo mật như mật khẩu hoặc khóa bí mật, hãy chắc chắn rằng bạn đã sử dụng các công cụ mã hóa đúng cách để bảo vệ dữ liệu của bạn.

Việc sử dụng Built-In Functions có thể ảnh hưởng đến hiệu suất của Terraform. Khi sử dụng quá nhiều hàm, nó có thể làm chậm quá trình thực thi của Terraform. Vì vậy, hãy sử dụng các hàm đó một cách cân nhắc và chỉ khi cần thiết. Ngoài ra, nếu có thể, hãy tìm cách tối ưu các mã của bạn để tránh việc sử dụng quá nhiều Built-In Functions.

Bạn cần phải hiểu rõ cú pháp và ý nghĩa của từng hàm một cách chính xác để tránh tình trạng sai sót và làm ảnh hưởng đến tính chính xác của mã. Ngoài ra, hãy sử dụng các phiên bản Terraform mới nhất để có được các Built-In Functions mới nhất và được hỗ trợ tốt nhất. Nếu bạn đang sử dụng phiên bản cũ hơn, có thể sẽ không có các hàm mới nhất hoặc một số hàm có thể không hoạt động chính xác.

Hạn chế sử dụng quá nhiều hàm trong cùng một biểu thức hoặc đoạn mã. Việc sử dụng quá nhiều hàm có thể làm cho mã của bạn trở nên khó đọc, khó bảo trì và gây tốn thời gian tính toán. Hãy xem xét tối ưu hóa mã của mình bằng cách sử dụng các hàm phù hợp nhất cho từng trường hợp và tránh sử dụng quá nhiều hàm trong một biểu thức hoặc đoạn mã.

Một lưu ý cuối cùng khi sử dụng Built-In Functions là luôn đọc kỹ tài liệu và hiểu rõ các tham số và cách thức hoạt động của hàm trước khi sử dụng chúng. Mỗi hàm có cách thức hoạt động và các tham số khác nhau, và việc hiểu rõ cách sử dụng hàm sẽ giúp bạn tránh những lỗi không mong muốn và sử dụng các hàm một cách hiệu quả hơn. Ngoài ra, cần đảm bảo rằng phiên bản Terraform bạn đang sử dụng hỗ trợ các Built-In Functions mà bạn muốn sử dụng.

3. Một số ví dụ minh hoạ.

Đây là một ví dụ về việc sử dụng các hàm tích hợp sẵn trong Terraform để quản lý hệ thống AWS.

Trong ví dụ này, chúng ta sử dụng hàm split() để tách chuỗi và trích xuất phần tử của một chuỗi có dạng subnet-xxxxxxxx,subnet-yyyyyyyy để tạo subnet với các phần tử này trong một mảng.

variable "subnets" {
  default = "subnet-xxxxxxxx,subnet-yyyyyyyy"
}

resource "aws_subnet" "example_subnet" {
  count = length(split(",", var.subnets))
  vpc_id = aws_vpc.example_vpc.id
  cidr_block = "10.0.${count.index}.0/24"
  availability_zone = "us-west-2a"
  tags = {
    Name = "example_subnet_${count.index}"
  }
}

resource "aws_network_interface" "example_interface" {
  count = length(split(",", var.subnets))
  subnet_id = element(split(",", var.subnets), count.index)
  description = "example_interface_${count.index}"
  tags = {
    Name = "example_interface_${count.index}"
  }
}

Ở đây, chúng ta sử dụng variable để định nghĩa chuỗi subnets có giá trị mặc định là "subnet-xxxxxxxx,subnet-yyyyyyyy". Tiếp theo, chúng ta sử dụng hàm split() để tách chuỗi này thành một mảng, trong đó phần tử đầu tiên là "subnet-xxxxxxxx", phần tử thứ hai là "subnet-yyyyyyyy". Chúng ta sử dụng count để tạo subnet và interface cho mỗi phần tử trong mảng này.

Trong Resource aws_subnet, chúng ta sử dụng length() để tính toán số phần tử trong mảng và tạo subnet tương ứng. Trong Resource aws_network_interface, chúng ta sử dụng hàm element() để lấy phần tử thứ count.index của mảng, và cấu hình interface tương ứng.

Việc sử dụng các hàm tích hợp sẵn này giúp cho quá trình quản lý hệ thống AWS bằng Terraform trở nên đơn giản và hiệu quả hơn.

Đây là một ví dụ về việc sử dụng các hàm tích hợp sẵn trong Terraform để quản lý hệ thống KVM.

Trong ví dụ này, chúng ta sử dụng hàm format() để tạo tên máy ảo KVM dựa trên một chuỗi định dạng và một số nguyên đếm.

resource "libvirt_domain" "example_vm" {
  count = 2
  name = format("example-vm-%02d", count.index + 1)
  memory = 2048
  vcpu = 2
  network_interface {
    network_name = "default"
  }
  disk {
    volume_id = libvirt_volume.example_volume.id
  }
}

resource "libvirt_volume" "example_volume" {
  count = 2
  name = format("example-volume-%02d", count.index + 1)
  capacity = "10G"
}

Ở đây, chúng ta sử dụng count để tạo hai máy ảo và hai ổ đĩa ảo. Để đặt tên cho các máy ảo và ổ đĩa ảo này, chúng ta sử dụng hàm format() với định dạng "example-vm-%02d""example-volume-%02d".

Trong đó, %02d là một chuỗi định dạng được sử dụng để đảm bảo rằng các số được đếm đều có độ dài là 2. Khi count.index là 0, tên máy ảo sẽ là "example-vm-01", khi count.index là 1, tên máy ảo sẽ là "example-vm-02", và tương tự cho các ổ đĩa ảo.

Việc sử dụng hàm format() này giúp cho việc đặt tên các máy ảo và ổ đĩa ảo trở nên dễ dàng và có tự động hơn, đồng thời giúp tránh được các lỗi khi đặt tên không đúng định dạng.

Đây là một ví dụ về việc sử dụng các hàm tích hợp sẵn trong Terraform để quản lý hệ thống vCenter.

Trong ví dụ này, chúng ta sử dụng hàm element() để lấy một phần tử trong một danh sách các giá trị.

resource "vsphere_datacenter" "example_datacenter" {
  name = "example_datacenter"
}

resource "vsphere_cluster" "example_cluster" {
  name               = "example_cluster"
  datacenter_id      = vsphere_datacenter.example_datacenter.id
  ha_enabled         = true
  vsan_enabled       = true
  vcenter_server     = var.vcenter_server
  datastore_cluster  = element(var.datastore_clusters, count.index)
  drs_automation_level = "partially-automated"
}

variable "datastore_clusters" {
  type = list(string)
  default = ["datastore_cluster1", "datastore_cluster2", "datastore_cluster3"]
}

Ở đây, chúng ta sử dụng count để tạo ra các cluster. Để chọn một trong các giá trị trong danh sách var.datastore_clusters để gán cho thuộc tính datastore_cluster của từng cluster, chúng ta sử dụng hàm element().

Ví dụ, nếu count.index là 0, hàm element(var.datastore_clusters, count.index) sẽ trả về giá trị "datastore_cluster1". Khi count.index là 1, hàm sẽ trả về giá trị "datastore_cluster2", và tương tự cho các cluster khác.

Việc sử dụng hàm element() này giúp cho việc lựa chọn các giá trị trong danh sách trở nên dễ dàng và có tự động hơn, đồng thời giúp tránh được các lỗi khi chọn giá trị không đúng.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories