Cách triển khai nhiều môi trường trong dự án Terraform của bạn mà không cần mã trùng lặp

Tác giả đã chọn Quỹ Nguồn mở và Miễn phí để nhận một khoản đóng góp như một phần của chương trình Viết cho DO donate.

Giới thiệu

Terraform cung cấp các tính năng nâng cao ngày càng trở nên hữu ích khi dự án của bạn phát triển về quy mô và độ phức tạp. Có thể giảm bớt chi phí duy trì các định nghĩa cơ sở hạ tầng phức tạp cho nhiều môi trường bằng cách cấu trúc mã của bạn để giảm thiểu sự lặp lại và giới thiệu quy trình công việc có hỗ trợ để kiểm tra và triển khai dễ dàng hơn.

Terraform liên kết a tiểu bang với một chương trình phụ trợ, xác định vị trí và cách trạng thái được lưu trữ và truy xuất. Mỗi trạng thái chỉ có một chương trình phụ trợ và được gắn với một cấu hình cơ sở hạ tầng. Một số phụ trợ nhất định, chẳng hạn như local hoặc s3, có thể chứa nhiều trạng thái. Trong trường hợp đó, việc ghép nối trạng thái và cơ sở hạ tầng với chương trình phụ trợ đang mô tả không gian làm việc. Không gian làm việc cho phép bạn triển khai nhiều phiên bản riêng biệt của cùng một cấu hình cơ sở hạ tầng mà không cần lưu trữ chúng trong các phần phụ trợ riêng biệt.

Trong này, trước tiên bạn sẽ triển khai nhiều phiên bản cơ sở hạ tầng bằng cách sử dụng các không gian làm việc khác nhau. Sau đó, bạn sẽ triển khai một tài nguyên trạng thái, trong hướng dẫn này, sẽ là một Khối lượng DigitalOcean. Cuối cùng, bạn sẽ tham khảo các mô-đun được tạo sẵn từ Cơ quan đăng ký Terraform, bạn có thể sử dụng mô-đun này để bổ sung cho mô-đun của riêng mình.

Điều kiện tiên quyết

Để hoàn thành hướng dẫn này, bạn sẽ cần:

  • Mã thông báo truy cập cá nhân DigitalOcean mà bạn có thể tạo thông qua Bảng điều khiển DigitalOcean. Bạn có thể tìm thấy hướng dẫn trong tài liệu sản phẩm DigitalOcean, Cách tạo mã thông báo truy cập cá nhân.
  • Terraform được cài đặt trên máy cục bộ của bạn và một dự án được thiết lập với nhà cung cấp DO. Hoàn thành Bước 1Bước 2 của hướng dẫn Cách sử dụng Terraform với DigitalOcean và nhớ đặt tên cho thư mục dự án terraform-advanced, thay vì loadbalance. Suốt trong Bước 2, không bao gồm pvt_key biến và tài nguyên khóa SSH.

Ghi chú: Hướng dẫn này đã được thử nghiệm cụ thể với Terraform 1.0.2.

Triển khai nhiều phiên bản cơ sở hạ tầng bằng cách sử dụng không gian làm việc

Nhiều không gian làm việc hữu ích khi bạn muốn triển khai hoặc thử nghiệm phiên bản đã sửa đổi của cơ sở hạ tầng chính mà không cần tạo dự án riêng biệt và thiết lập lại khóa xác thực. Khi bạn đã phát triển và thử nghiệm một tính năng bằng cách sử dụng trạng thái riêng biệt, bạn có thể kết hợp mã mới vào không gian làm việc chính và có thể xóa trạng thái bổ sung. Khi bạn init một dự án Terraform, bất kể phụ trợ, Terraform tạo ra một không gian làm việc có tên là default. Nó luôn hiện diện và bạn không bao giờ có thể xóa nó.

Tuy nhiên, nhiều không gian làm việc không phải là giải pháp phù hợp để tạo nhiều môi trường, chẳng hạn như cho dàn dựng và sản xuất. Do đó, không gian làm việc, chỉ theo dõi trạng thái, không lưu trữ mã hoặc các sửa đổi của nó.

Vì không gian làm việc không theo dõi mã thực, bạn nên quản lý sự phân tách mã giữa nhiều không gian làm việc ở cấp kiểm soát phiên bản (VCS) bằng cách khớp chúng với các biến thể cơ sở hạ tầng của chúng. Làm thế nào bạn có thể đạt được điều này phụ thuộc vào chính công cụ VCS; ví dụ, trong các nhánh Git sẽ là một sự trừu tượng phù hợp. Để quản lý mã cho nhiều môi trường dễ dàng hơn, bạn có thể chia chúng thành các mô-đun có thể sử dụng lại để tránh lặp lại mã tương tự cho từng môi trường.

Xem tiếp:   Cách ngăn Windows 10 mở lại các ứng dụng sau khi khởi động lại máy tính

Triển khai tài nguyên trong không gian làm việc

Bây giờ bạn sẽ tạo một dự án triển khai Droplet, bạn sẽ áp dụng dự án này từ nhiều không gian làm việc.

Bạn sẽ lưu trữ định nghĩa Droplet trong một tệp có tên droplets.tf.

Giả sử bạn đang ở terraform-advanced , tạo và mở nó để chỉnh sửa bằng cách chạy:

Add the following lines:

resource "digitalocean_droplet" "web" {
  image  = "ubuntu-18-04-x64"
  name   = "web-${terraform.workspace}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

Định nghĩa này sẽ tạo ra một Droplet chạy Ubuntu 18.04 với một lõi CPU và RAM 1 GB trong fra1 khu vực. Tên của nó sẽ chứa tên của không gian làm việc hiện tại mà nó được triển khai. Khi bạn hoàn tất, hãy lưu và đóng tệp.

Áp dụng dự án cho Terraform để chạy các hành động của nó với:

  • terraform apply -var "do_token=${DO_PAT}"

Đầu ra sẽ giống như sau:

Output

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.web will be created + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + id = (known after apply) + image = "ubuntu-18-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + ipv6_address_private = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-default" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

Vào yes khi được nhắc triển khai Droplet trong default không gian làm việc.

Tên của Giọt sẽ là web-default, bởi vì không gian làm việc bạn bắt đầu được gọi là default. Bạn có thể liệt kê các không gian làm việc để xác nhận rằng đó là không gian duy nhất khả dụng:

The output will look similar to this:

Output

* default

Dấu hoa thị (*) nghĩa là bạn hiện đã chọn không gian làm việc đó.

Tạo và chuyển sang một không gian làm việc mới có tên testing, mà bạn sẽ sử dụng để triển khai một Droplet khác, bằng cách chạy workspace new:

  • terraform workspace new testing

Đầu ra sẽ giống như sau:

Output

Created and switched to workspace "testing"! You're now on a new, empty workspace. Workspaces isolate their state, so if you run "terraform plan" Terraform will not see any existing state for this configuration.

Bạn lập kế hoạch triển khai lại Droplet bằng cách chạy:

  • terraform plan -var "do_token=${DO_PAT}"

Đầu ra sẽ tương tự như lần chạy trước:

Output

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.web will be created + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + id = (known after apply) + image = "ubuntu-18-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + ipv6_address_private = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-testing" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

Lưu ý rằng Terraform có kế hoạch triển khai Droplet được gọi là web-testing, mà nó đã đặt tên khác với web-default. Điều này là bởi vì defaulttesting không gian làm việc có các trạng thái riêng biệt và không có kiến ​​thức về tài nguyên của nhau - mặc dù chúng xuất phát từ cùng một mã.

Xem tiếp:   tải nhạc youtube sang mp3 trên điện thoại nhanh đơn giản

Để xác nhận rằng bạn đang ở testing không gian làm việc, xuất ra không gian hiện tại mà bạn đang sử dụng workspace show:

The output will be the name of the current workspace:

Output

testing

Để xóa một không gian làm việc, trước tiên bạn cần phải hủy tất cả các tài nguyên đã triển khai của nó. Sau đó, nếu nó đang hoạt động, bạn cần chuyển sang một cái khác bằng cách sử dụng workspace select. Kể từ khi testing không gian làm việc ở đây trống, bạn có thể chuyển sang default ngay lập tức:

  • terraform workspace select default

Bạn sẽ nhận được đầu ra của Terraform xác nhận việc chuyển đổi:

Output

Switched to workspace "default".

Sau đó, bạn có thể xóa nó bằng cách chạy workspace delete:

  • terraform workspace delete testing

Terraform sau đó sẽ thực hiện xóa:

Output

Deleted workspace "testing"!

Bạn có thể phá hủy Droplet mà bạn đã triển khai trong default không gian làm việc bằng cách chạy:

  • terraform destroy -var "do_token=${DO_PAT}"

Vào yes khi được nhắc kết thúc quá trình.

Trong phần này, bạn đã làm việc trong nhiều không gian làm việc Terraform. Trong phần tiếp theo, bạn sẽ triển khai một tài nguyên trạng thái.

Triển khai tài nguyên trạng thái

Tài nguyên không trạng thái không lưu trữ dữ liệu, vì vậy bạn có thể tạo và thay thế chúng một cách nhanh chóng, vì chúng không phải là duy nhất. Mặt khác, tài nguyên trạng thái chứa dữ liệu là duy nhất hoặc không chỉ đơn giản là có thể tạo lại; do đó, chúng yêu cầu lưu trữ dữ liệu liên tục.

Vì cuối cùng bạn có thể phá hủy các tài nguyên đó hoặc nhiều tài nguyên yêu cầu dữ liệu của chúng, nên tốt nhất bạn nên lưu trữ nó trong một thực thể riêng biệt, chẳng hạn như DigitalOcean Volumes.

Các tập cung cấp thêm không gian lưu trữ. Chúng có thể được gắn vào Droplets (máy chủ), nhưng tách biệt với chúng. Trong bước này, bạn sẽ xác định Âm lượng và kết nối nó với một giọt trong droplets.tf.

Mở nó để chỉnh sửa:

Add the following lines:

resource "digitalocean_droplet" "web" {
  image  = "ubuntu-18-04-x64"
  name   = "web-${terraform.workspace}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

resource "digitalocean_volume" "volume" {
  region                  = "fra1"
  name                    = "new-volume"
  size                    = 10
  initial_filesystem_type = "ext4"
  description             = "New Volume for Droplet"
}

resource "digitalocean_volume_attachment" "volume_attachment" {
  droplet_id = digitalocean_droplet.web.id
  volume_id  = digitalocean_volume.volume.id
}

Ở đây, bạn xác định hai tài nguyên mới, chính Tập đĩa và một phần đính kèm Khối lượng. Khối lượng sẽ là 10GB, được định dạng là ext4, gọi là new-volume, và nằm trong cùng khu vực với Droplet. Vì Volume và Droplet là các thực thể riêng biệt, bạn sẽ cần xác định đối tượng đính kèm Volume để kết nối chúng. volume_attachment lấy ID giọt và ID âm lượng và hướng dẫn đám mây DigitalOcean cung cấp Âm lượng cho Droplet dưới dạng thiết bị đĩa.

Khi bạn hoàn tất, hãy lưu và đóng tệp.

Lập kế hoạch cấu hình này bằng cách chạy:

  • terraform plan -var "do_token=${DO_PAT}"

Các hành động mà Terraform sẽ lập kế hoạch sẽ như sau:

Output

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.web will be created + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + id = (known after apply) + image = "ubuntu-18-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + ipv6_address_private = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-default" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } # digitalocean_volume.volume will be created + resource "digitalocean_volume" "volume" { + description = "New Volume for Droplet" + droplet_ids = (known after apply) + filesystem_label = (known after apply) + filesystem_type = (known after apply) + id = (known after apply) + initial_filesystem_type = "ext4" + name = "new-volume" + region = "fra1" + size = 10 + urn = (known after apply) } # digitalocean_volume_attachment.volume_attachment will be created + resource "digitalocean_volume_attachment" "volume_attachment" { + droplet_id = (known after apply) + id = (known after apply) + volume_id = (known after apply) } Plan: 3 to add, 0 to change, 0 to destroy. ...

Các chi tiết đầu ra mà Terraform sẽ tạo ra một Giọt, một Khối lượng và một phần đính kèm Khối lượng, kết nối Khối lượng với Giọt.

Xem tiếp:   Hướng dẫn cài đặt LEMP stack trên Ubuntu 20.04

Bây giờ bạn đã xác định và kết nối một Khối lượng (một tài nguyên trạng thái) với một giọt. Trong phần tiếp theo, bạn sẽ xem xét các mô-đun Terraform công khai, được tạo sẵn mà bạn có thể kết hợp vào dự án của mình.

Tham khảo các mô-đun được tạo sẵn

Ngoài việc tạo các mô-đun tùy chỉnh của riêng bạn cho các dự án của bạn, bạn cũng có thể sử dụng các mô-đun và nhà cung cấp được tạo sẵn từ các nhà phát triển khác, có sẵn công khai tại Terraform Registry.

Trong phần mô-đun, bạn có thể tìm kiếm cơ sở dữ liệu của các mô-đun có sẵn và sắp xếp theo nhà cung cấp để tìm mô-đun có chức năng bạn cần. Khi bạn đã tìm thấy một, bạn có thể đọc mô tả của nó, trong đó liệt kê các đầu vào và đầu ra mà mô-đun cung cấp, cũng như các phụ thuộc của mô-đun và nhà cung cấp bên ngoài của nó.

Cơ quan đăng ký Terraform - Mô-đun khóa SSH

Bây giờ bạn sẽ thêm mô-đun khóa SSH DigitalOcean vào dự án của mình. Bạn sẽ lưu trữ mã tách biệt với các định nghĩa hiện có trong một tệp có tên ssh-key.tf. Tạo và mở nó để chỉnh sửa bằng cách chạy:

Add the following lines:

module "ssh-key" {
  source         = "clouddrove/ssh-key/digitalocean"
  key_path       = "~/.ssh/id_rsa.pub"
  key_name       = "new-ssh-key"
  enable_ssh_key = true
}

Mã này xác định một phiên bản của clouddrove/droplet/digitalocean mô-đun từ sổ đăng ký và đặt một số tham số mà nó cung cấp. Nó sẽ thêm một khóa SSH công khai vào tài khoản của bạn bằng cách đọc nó từ ~/.ssh/id_rsa.pub.

Khi bạn hoàn tất, hãy lưu và đóng tệp.

Trước bạn plan mã này, bạn phải tải xuống mô-đun được tham chiếu bằng cách chạy:

You'll receive output similar to the following:

Output

Initializing modules... Downloading clouddrove/ssh-key/digitalocean 0.13.0 for ssh-key... - ssh-key in .terraform/modules/ssh-key Initializing the backend... Initializing provider plugins... - Reusing previous version of digitalocean/digitalocean from the dependency lock file - Using previously-installed digitalocean/digitalocean v2.10.1 Terraform has been successfully initialized! ...

Bây giờ bạn có thể lập kế hoạch mã cho các thay đổi:

  • terraform plan -var "do_token=${DO_PAT}"

Bạn sẽ nhận được đầu ra tương tự như sau:

Output

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: ... # module.ssh-key.digitalocean_ssh_key.default[0] will be created + resource "digitalocean_ssh_key" "default" { + fingerprint = (known after apply) + id = (known after apply) + name = "devops" + public_key = "ssh-rsa ... demo@clouddrove" } Plan: 4 to add, 0 to change, 0 to destroy. ...

Kết quả đầu ra cho thấy rằng bạn sẽ tạo tài nguyên khóa SSH, có nghĩa là bạn đã tải xuống và gọi mô-đun từ mã của mình.

Phần kết luận

Các dự án lớn hơn có thể sử dụng một số tính năng nâng cao mà Terraform cung cấp để giúp giảm độ phức tạp và bảo trì dễ dàng hơn. Không gian làm việc cho phép bạn kiểm tra các bổ sung mới cho mã của mình mà không cần chạm vào các triển khai chính ổn định. Bạn cũng có thể kết hợp không gian làm việc với hệ thống kiểm soát phiên bản để theo dõi các thay đổi mã. Việc sử dụng các mô-đun được tạo sẵn cũng có thể rút ngắn thời gian phát triển, nhưng có thể phát sinh thêm chi phí hoặc thời gian trong tương lai nếu mô-đun trở nên lỗi thời.

Hướng dẫn này là một phần của loạt bài Cách Quản lý Cơ sở hạ tầng với Terraform. Loạt bài này bao gồm một số chủ đề về Terraform, từ việc cài đặt Terraform lần đầu tiên đến quản lý các dự án phức tạp.

.

Check Also

Cách cung cấp các ứng dụng Flask với Gunicorn và Nginx trên Ubuntu

Giới thiệu Trong hướng dẫn này, bạn sẽ xây dựng một ứng dụng Python bằng …