Terraform cho phép bạn biểu diễn Cơ sở hạ tầng dưới dạng Mã (IaC). Bạn có thể sử dụng nó để quản lý cơ sở hạ tầng, tăng tốc triển khai và chia sẻ các tệp cấu hình cơ sở hạ tầng của bạn trong một nhóm. Trong hướng dẫn này, bạn sẽ sử dụng Terraform để tạo NodeBalancer phân phối lưu lượng giữa hai Linode.

Quan trọng: Cấu hình và lệnh được sử dụng trong hướng dẫn này sẽ dẫn đến việc nhiều tài nguyên có thể thanh toán được thêm vào tài khoản của bạn. Hãy đảm bảo theo dõi chặt chẽ tài khoản của bạn trong Linode Cloud Manager để tránh các khoản phí không mong muốn. Xem hướng dẫn Thanh toán và Hóa đơn để biết thêm chi tiết.Nếu bạn muốn ngừng tính phí cho các tài nguyên được tạo trong hướng dẫn này, hãy xóa chúng khi bạn hoàn thành công việc.

Trước khi bạn bắt đầu

  1. Bạn nên cài đặt Terraform trong môi trường phát triển của mình và có kiến ​​thức thực tế về cấu hình tài nguyên Terraform và nhà cung cấp Linode . Để biết thêm thông tin về cách cài đặt và sử dụng Terraform, hãy xem hướng dẫn Sử dụng Terraform để cung cấp môi trường Linode của chúng tôi .Ghi chúNhà cung cấp Linode của Terraform đã được cập nhật và hiện yêu cầu Terraform phiên bản 0.12 trở lên. Để tìm hiểu cách nâng cấp an toàn lên Terraform phiên bản 0.12 trở lên, hãy xem tài liệu chính thức của Terraform . Xem nhật ký thay đổi của Terraform v0.12 để biết danh sách đầy đủ các tính năng mới và ghi chú về sự không tương thích của phiên bản.Các ví dụ trong hướng dẫn này được viết để tương thích với Terraform phiên bản 0.11 và sẽ được cập nhật trong tương lai gần.
  2. Terraform yêu cầu mã thông báo truy cập API. Làm theo hướng dẫn Bắt đầu với API Linode để lấy mã thông báo.
  3. Tạo một terraform_nodebalancerthư mục trên máy tính của bạn cho dự án Terraform mà bạn sẽ tạo trong hướng dẫn này. Tất cả các tệp bạn tạo trong hướng dẫn này phải được đặt trong thư mục này và bạn phải chạy tất cả các lệnh từ thư mục này. Dự án mới này không được tạo bên trong thư mục dự án Terraform khác, bao gồm cả thư mục mà bạn có thể đã tạo khi làm theo Sử dụng Terraform để cung cấp môi trường Linode trước đó .

Tạo tệp cấu hình Terraform

Tạo một khối nhà cung cấp

Bước đầu tiên cần thực hiện khi tạo tệp cấu hình Terraform là tạo khối nhà cung cấp . Khối này cho Terraform biết nhà cung cấp nào cần sử dụng. Giá trị cấu hình duy nhất mà nhà cung cấp Linode cần là mã thông báo truy cập API.

Tạo một tệp có tên nodebalancer.tftrong thư mục dự án Terraform của bạn. Bạn sẽ thêm vào tệp này trong suốt hướng dẫn. Thêm các khối nhà cung cấp vào tệp:

terraform {
  required_providers {
    linode = {
      source = "linode/linode"
      version = "1.16.0"
    }
  }
}

provider "linode" {
    token = var.token
}

Khối nhà cung cấp này sử dụng nội suy biến để truy cập giá trị của mã thông báo API của bạn. Bạn sẽ tạo các biến đầu vào trong một variables.tftệp riêng sau trong phần Xác định biến Terraform của hướng dẫn này. Bất kỳ biến đầu vào nào bạn xác định trong variables.tftệp đều có sẵn từ vartừ điển bằng ký hiệu dấu chấm. Bạn sẽ sử dụng nội suy biến và tham chiếu các biến bằng ký hiệu dấu chấm trong suốt hướng dẫn này.

Tạo một tài nguyên NodeBalancer

Tạo tài nguyên NodeBalancer trong nodebalancer.tftệp:

...

resource "linode_nodebalancer" "example-nodebalancer" {
    label = "examplenodebalancer"
    region = var.region
}

...

Tài linode_nodebalancernguyên cung cấp hai nhãn. Nhãn đầu tiên, example-nodebalancer, được Terraform sử dụng nội bộ. Nhãn thứ hai, examplenodebalancer, được sử dụng để tham chiếu NodeBalancer của bạn trong các công cụ như Manager và Linode CLI. Vùng cho NodeBalancer này được cung cấp với biến region.

Tạo tài nguyên cấu hình NodeBalancer

Ngoài tài nguyên NodeBalancer, bạn phải cung cấp ít nhất một tài nguyên Cấu hình NodeBalancer. Tài nguyên này định nghĩa các cổng, giao thức, kiểm tra tình trạng và độ bám dính của phiên, cùng với các tùy chọn khác mà NodeBalancer có thể sử dụng. Đối với ví dụ này, bạn sẽ tạo cấu hình NodeBalancer để truy cập HTTP trên cổng 80, nhưng bạn cũng có thể tạo cấu hình để truy cập HTTPS trên cổng 443 nếu bạn có chứng chỉ SSL/TLS :

...

resource "linode_nodebalancer_config" "example-nodebalancer-config" {
    nodebalancer_id = linode_nodebalancer.example-nodebalancer.id
    port = 80
    protocol = "http"
    check = "http_body"
    check_path = "/healthcheck/"
    check_body = "healthcheck"
    check_attempts = 30
    check_timeout = 25
    check_interval = 30
    stickiness = "http_cookie"
    algorithm = "roundrobin"
}

...

Tài nguyên NodeBalancer Config yêu cầu một NodeBalancer ID, được điền vào dòng đầu tiên bằng biến linode_nodebalancer.example-nodebalancer.id. Vì nodebalancer_idđối số tham chiếu đến một NodeBalancer chưa được tạo, bạn có thể sử dụng biến này làm trình giữ chỗ để tham chiếu đến NodeBalancer ID. Terraform sẽ tự động biết để tạo tài nguyên NodeBalancer trước khi tạo bất kỳ tài nguyên nào khác tham chiếu đến tài nguyên đó. Theo cách này, bạn có thể tạo cơ sở hạ tầng phức tạp tham chiếu đến các phần của chính nó mà không cần phải lo lắng về thứ tự xuất hiện của các tài nguyên trong cấu hình Terraform hoặc liệu các tài nguyên đó đã tồn tại hay chưa.

Về phần cài đặt, kiểm tra tình trạng được đặt thành http_body, nghĩa là kiểm tra tình trạng sẽ tìm chuỗi được đặt bởi check_bodytrong phần thân của trang được đặt tại check_path. NodeBalancer sẽ đưa một nút ra khỏi vòng quay sau 30 lần kiểm tra không thành công. Mỗi lần kiểm tra sẽ đợi phản hồi trong 25 giây trước khi được coi là lỗi, với 30 giây giữa các lần kiểm tra. Ngoài ra, cài đặt độ dính của phiên đã được đặt thành http_cookie. Điều này nghĩa là người dùng sẽ tiếp tục được gửi đến cùng một máy chủ bằng cách sử dụng cookie phiên. Thuật toán đã được đặt thành roundrobin, thuật toán này sẽ sắp xếp người dùng đồng đều trên các nút phụ trợ của bạn dựa trên máy chủ nào được truy cập lần cuối.

Ghi chú: Xem lại Hướng dẫn tham khảo NodeBalancer để biết danh sách đầy đủ các tùy chọn cấu hình NodeBalancer.

Tạo tài nguyên NodeBalancer

Phần thứ ba của quá trình thiết lập NodeBalancer trong Terraform là tạo tài nguyên NodeBalancer. Tài nguyên này chứa thông tin về từng Node và cách chúng liên quan đến tài nguyên NodeBalancer và NodeBalancer Configuration.

...

resource "linode_nodebalancer_node" "example-nodebalancer-node" {
    count = var.node_count
    nodebalancer_id = linode_nodebalancer.example-nodebalancer.id
    config_id = linode_nodebalancer_config.example-nodebalancer-config.id
    label = "example-node-${count.index + 1}"
    address = "${element(linode_instance.example-instance.*.private_ip_address, count.index)}:80"
    mode = "accept"
}

...

Đối số của tài nguyên này countsẽ được điền bằng node_countbiến đầu vào mà bạn sẽ định nghĩa sau trong hướng dẫn này. countĐối số cho Terraform biết rằng nó sẽ cung cấp node_countsố lượng Node.

Vì việc cung cấp nhiều hơn một nút sẽ tạo ra một vòng lặp trong quy trình Terraform, trong đó bước tạo nút được lặp lại, bạn có thể sử dụng biến count.indexđể theo dõi Terraform đang ở lần lặp nào trong vòng lặp. Nội suy {count.index + 1}trong đối số của nút labelcho Terraform biết rằng bạn muốn mỗi nút được gắn nhãn tuần tự và vì count.indexbắt đầu từ số không, bạn muốn số lượng bắt đầu từ một.

linode_instance.example-instance.*.private_ip_addresstham chiếu đến các địa chỉ IP riêng của các phiên bản Linode chưa được tạo. Ở bước tiếp theo, các tài nguyên Phiên bản Linode sẽ được gắn nhãn example-instance. Terraform có quyền truy cập vào một số thuộc tính cho mỗi tài nguyên mà nó tạo ra và private_ip_addresslà một trong những thuộc tính khả dụng từ tài nguyên Phiên bản Linode. Vì sẽ có hai phiên bản Linode được tạo trong cùng một bước, Terraform nhóm các tập hợp thuộc tính này trong một danh sách. element()Hàm này cho phép bạn lấy một mục duy nhất từ ​​danh sách dựa trên chỉ mục mục. Ở đây, thay vì cung cấp một số được mã hóa cứng cho chỉ mục, bạn có thể cung cấp count.index. Theo cách này, NodeBalancer đầu tiên sẽ tham chiếu đến địa chỉ IP riêng của phiên bản Linode đầu tiên và NodeBalancer thứ hai sẽ tham chiếu đến địa chỉ IP riêng của phiên bản thứ hai.

Tạo một tài nguyên Linode Instance

Bây giờ bạn đã cấu hình NodeBalancer, bạn cần cung cấp cho nó một tài nguyên Linode Instance. Tài nguyên này sẽ cho phép Terraform biết những instance nào cần tạo để đáp ứng nhu cầu của ví dụ NodeBalancer của chúng ta.

...

resource "linode_instance" "example-instance" {
    count  = var.node_count
    label  = "example-instance-${count.index + 1}"
    group = "nodebalancer-example"
    tags = ["nodebalancer-example"]
    region = var.region
    type = "g6-nanode-1"
    image = "linode/ubuntu18.10"
    authorized_keys = [chomp(file(var.ssh_key))]
    root_pass = random_string.password.result
    private_ip = true

    provisioner "remote-exec" {
        inline = [
            # install NGINX
            "export PATH=$PATH:/usr/bin",

            "apt-get -q update",
            "mkdir -p /var/www/html/",
            "mkdir -p /var/www/html/healthcheck",
            "echo healthcheck > /var/www/html/healthcheck/index.html",
            "echo node ${count.index + 1} > /var/www/html/index.html",
            "apt-get -q -y install nginx",
        ]

        connection {
            type = "ssh"
            user = "root"
            password = random_string.password.result
            host = self.ip_address
        }
    }
}

...

Tài nguyên trên sử dụng cùng một countđối số như tài nguyên NodeBalancer Node đã được cấu hình ở bước trước. Ngoài ra, labelđối số đang được tăng tuần tự theo cách tương tự như NodeBalancer Node.

Đối authorized_keyssố được cung cấp là biến đầu vào khóa SSH sẽ được định nghĩa sau trong hướng dẫn này. Nó được truyền cho hàm file(), đọc nội dung của tệp thành chuỗi. Chuỗi đó sau đó được truyền cho chomp()hàm, xóa bất kỳ khoảng trắng thừa nào.

root_passđược cung cấp kết quả của random_stringtài nguyên sẽ được xác định sau trong hướng dẫn này.

Điều cuối cùng cần lưu ý trong tài nguyên Linode Instance này là remote-execkhối Provisioner. Khối này chứa hai thành phần khác, inlinedanh sách và connectionkhối. inlinelà danh sách các lệnh mà Terraform sẽ thực thi trên Linode instance sau khi Linode instance đã khởi động. Trong ví dụ này, các lệnh nội tuyến sẽ: cập nhật Linode instance, tạo cấu trúc thư mục cần thiết cho NGINX, tạo tệp kiểm tra tình trạng và index.htmltệp tổng quát hơn, và cài đặt NGINX.

Khối connectiongiải thích cho Terraform cách nó có thể truy cập vào phiên bản Linode để chạy các lệnh do inlinedanh sách cung cấp. Trong trường hợp này, Terraform sẽ có thể truy cập qua SSH, đăng nhập với tư cách là rootngười dùng.

Tạo một đầu ra

Bước cuối cùng bạn sẽ thực hiện khi tạo nodebalancer.tflà thêm đầu ra. Terraform sẽ thêm thông tin này vào cuối đầu ra của nó trong terminal. Đầu ra có thể là bất kỳ thông tin nào từ cấu hình của bạn mà bạn muốn hiển thị. Dưới đây là một ví dụ sẽ hiển thị địa chỉ IP công khai của NodeBalancer:

...

output "nodebalancer_ip_address" {
    value = linode_nodebalancer.example-nodebalancer.ipv4
}

Xác định các biến Terraform

Bây giờ bạn sẽ khai báo tất cả các biến cần thiết cho cấu hình Terraform của bạn trong một variables.tftệp.

1.Tạo một tệp có tên là variables.tf. Tệp này sẽ tạo các biến được tham chiếu trong cấu hình NodeBalancer và Nodes của bạn. Bạn sẽ cung cấp giá trị cho các biến trong một bước khác.

variable "token" {
    description = "Your APIv4 Access Token"
}

variable "region" {
    description = "The data center where your NodeBalancer and Nodes will reside. E.g., 'us-east'."
    default = "us-west"
}

variable "node_count" {
    description = "The amount of backend Nodes to create."
}

variable "ssh_key" {
    description = "The local file location of the SSH key that will be transferred to each Linode."
    default = "~/.ssh/id_rsa.pub"
}

resource "random_string" "password" {
    length = 32
    special = true
    upper = true
    lower = true
    number = true
}

Terraform cho phép mỗi biến có mô tả và giá trị mặc định riêng. Các biến này sẽ có giá trị được điền thông qua việc sử dụng tệp terraform.tfvarsmà bạn sẽ tạo ở bước tiếp theo. Việc tách định nghĩa biến khỏi giá trị của chúng giúp ngăn dữ liệu nhạy cảm xâm nhập vào mã Terraform của bạn, nếu bạn chọn đưa mã của mình vào hệ thống kiểm soát phiên bản như Git.Ngoài các biến bạn đã định nghĩa ở trên, còn có một random_stringtài nguyên có nhãn password. Tài nguyên này được cung cấp bởi nhà cung cấp Random và sẽ tạo ra một chuỗi ngẫu nhiên gồm 32 ký tự, bao gồm các ký tự viết hoa, ký tự viết thường và số. Chuỗi này sẽ là mật khẩu gốc cho các Nodes phụ trợ của bạn. Nếu bạn muốn kiểm soát chính xác mật khẩu của mình, bạn có thể định nghĩa mật khẩu tại đây variables.tfvà đặt giá trị cho mật khẩu đó terraform.tfvarstrong bước tiếp theo.

2.Tạo terraform.tfvarstệp và cung cấp giá trị cho các biến tokenregion, và node_count. Ví dụ này sử dụng us-easttrung tâm dữ liệu và node_countlà hai.

token = "your_api_token"
region = "us-east"
node_count = 2

Khi Terraform chạy, nó sẽ tìm kiếm một tệp có tên terraform.tfvars, hoặc các tệp có phần mở rộng *.auto.tfvars, và điền các giá trị đó vào các biến Terraform. Nếu khóa SSH của bạn nằm ở vị trí tệp khác với giá trị mặc định, tức là không tồn tại tại ~/.ssh/id_rsa.pub, thì bạn sẽ cần thêm giá trị đó vào terraform.tfvars.

Ghi chú: Nếu bạn muốn sử dụng giá trị mặc định của biến đầu vào được xác định trong variables.tftệp, bạn có thể bỏ qua việc cung cấp giá trị cho biến đó trong terraform.tfvarstệp.

Bạn có thể thoải mái thay đổi bất kỳ giá trị nào trong terraform.tfvarstệp theo ý thích của mình. Để biết danh sách ID trung tâm dữ liệu, bạn có thể sử dụng lệnh cURL để truy vấn API:

curl https://api.linode.com/v4/regions

Khởi tạo, lập kế hoạch và áp dụng trạng thái Terraform

Vì hướng dẫn này sử dụng hai nhà cung cấp (Linode và Random) mà bạn có thể chưa cài đặt trên môi trường phát triển cục bộ của mình, nên bạn sẽ cần chạy initlệnh để cài đặt chúng.

terraform init

Bạn sẽ thấy thông báo Terraform đã được khởi tạo thành công.

Để xem lại kế hoạch hành động của Terraform được xác định trong nodebalancer.tftệp, hãy chạy planlệnh:

terraform plan

Bạn sẽ thấy một đầu ra dài với tất cả các createhành động sẽ diễn ra. Xem lại đầu ra, lưu ý rằng <computed>các giá trị bạn thấy sẽ được xác định khi tạo. Khi bạn hài lòng với các hành động được đề xuất, đã đến lúc áp dụng chúng.

Chạy applylệnh:

terraform apply

Bạn sẽ được nhắc chấp thuận hành applyđộng. Nhập yes và nhấn Enter . Terraform sẽ bắt đầu tạo các tài nguyên bạn đã cấu hình ở các bước trước. Quá trình này sẽ mất vài phút, sau đó bạn sẽ bắt đầu thấy đầu ra của remote-execcác lệnh bạn đã xác định trong tài nguyên phiên bản Linode của mình. Khi tất cả các hành động hoàn tất, bạn sẽ thấy đầu ra như sau:

Apply complete! Resources: 7 added, 0 changed, 0 destroyed.

Outputs:

NodeBalancer IP Address = 104.237.148.131

Điều hướng đến địa chỉ IP NodeBalancer của bạn và xem NodeBalancer của bạn đang hoạt động. Bạn đã tạo thành công NodeBalancer và các nút phụ trợ trong Terraform.

(Tùy chọn) Xóa tài nguyên NodeBalancer

Nếu bạn đã hoàn tất các tài nguyên vừa tạo, bạn có thể xóa chúng bằng destroylệnh

terraform destroy

Lệnh này sẽ nhắc bạn xác nhận hành động.

Thông tin thêm

Bạn có thể muốn tham khảo các nguồn sau để biết thêm thông tin về chủ đề này. Mặc dù chúng tôi cung cấp với hy vọng rằng chúng sẽ hữu ích, nhưng xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc tính kịp thời của các tài liệu được lưu trữ bên ngoài.

Nguồn: https://www.linode.com/docs/guides/create-a-nodebalancer-with-terraform/