Thứ hai, 28/09/2020 | 00:00 GMT+7

Cách cấu trúc một dự án Terraform

Cấu trúc các dự án Terraform một cách thích hợp theo các trường hợp sử dụng và mức độ phức tạp được nhận thấy là cần thiết đảm bảo khả năng bảo trì và khả năng mở rộng của chúng trong các hoạt động hàng ngày. Một cách tiếp cận có hệ thống để tổ chức đúng các file mã là cần thiết đảm bảo rằng dự án vẫn có thể mở rộng trong quá trình triển khai và có thể sử dụng được cho bạn và group của bạn.

Trong hướng dẫn này, bạn sẽ tìm hiểu về cấu trúc các dự án Terraform theo mục đích chung và độ phức tạp của chúng. Sau đó, bạn sẽ tạo một dự án với cấu trúc đơn giản bằng cách sử dụng các tính năng phổ biến hơn của Terraform: biến, local , nguồn dữ liệu và người cung cấp. Cuối cùng, dự án của bạn sẽ triển khai server Ubuntu 18.04 (Server) trên DigitalOcean, cài đặt web server Apache và trỏ domain của bạn đến web server .

Yêu cầu

Lưu ý: Hướng dẫn này đã được thử nghiệm cụ thể với Terraform 0.13 .

Hiểu cấu trúc của một dự án Terraform

Trong phần này, bạn sẽ tìm hiểu Terraform coi một dự án là gì, cách bạn có thể cấu trúc mã cơ sở hạ tầng và khi nào nên chọn phương pháp tiếp cận. Bạn cũng sẽ tìm hiểu về không gian làm việc Terraform, những gì chúng làm và cách Terraform đang lưu trữ trạng thái.

Tài nguyên là một thực thể của dịch vụ cloud (chẳng hạn như DigitalOcean Server) được khai báo trong mã Terraform được tạo theo các thuộc tính được chỉ định và suy luận. Nhiều nguồn lực tạo thành cơ sở hạ tầng với các kết nối lẫn nhau của chúng.

Terraform sử dụng một ngôn ngữ lập trình chuyên biệt để xác định cơ sở hạ tầng, được gọi là Ngôn ngữ cấu hình Hashicorp (HCL). Mã HCL thường được lưu trữ trong các file kết thúc bằng phần mở rộng tf . Dự án Terraform là bất kỳ folder nào chứa file tf và đã được khởi tạo bằng lệnh init , lệnh này cài đặt cache Terraform và trạng thái local mặc định.

Trạng thái Terraform là cơ chế mà qua đó nó theo dõi các tài nguyên thực sự được triển khai trên cloud . Trạng thái được lưu trữ trong các phần mềm backend — local , trên đĩa hoặc từ xa, trên dịch vụ cloud lưu trữ file hoặc phần mềm quản lý nhà nước chuyên dụng, để dự phòng tối ưu và độ tin cậy. Bạn có thể đọc thêm về các backend khác nhau trong tài liệu Terraform .

Không gian làm việc của dự án cho phép bạn có nhiều trạng thái trong cùng một phần backend , được gắn với cùng một cấu hình. Điều này cho phép bạn triển khai nhiều version riêng biệt của cùng một cơ sở hạ tầng. Mỗi dự án bắt đầu với một không gian làm việc có tên default — không gian này sẽ được sử dụng nếu bạn không tạo hoặc chuyển sang một không gian khác một cách rõ ràng.

Các module trong Terraform (tương tự như các thư viện trong các ngôn ngữ lập trình khác) là các containers mã được tham số hóa bao gồm nhiều khai báo tài nguyên. Chúng cho phép bạn trừu tượng hóa một phần chung của cơ sở hạ tầng và sử dụng lại nó sau này với các đầu vào khác nhau.

Dự án Terraform cũng có thể bao gồm các file mã bên ngoài để sử dụng với đầu vào dữ liệu động, có thể phân tích cú pháp kết quả JSON của lệnh CLI và cung cấp nó để sử dụng trong khai báo tài nguyên. Trong hướng dẫn này, bạn sẽ làm điều này với một tập lệnh Python.

Đến đây bạn đã biết dự án Terraform bao gồm những gì, ta hãy xem xét hai cách tiếp cận chung về cấu trúc dự án Terraform.

Cấu trúc đơn giản

Thích hợp cho các dự án nhỏ và đang thử nghiệm, với một số tài nguyên thuộc nhiều loại và biến khác nhau. Nó có một vài file cấu hình, thường là một file cho mỗi loại tài nguyên (hoặc nhiều file trợ giúp cùng với file chính) và không có module tùy chỉnh, bởi vì hầu hết các tài nguyên là duy nhất và không có đủ để tổng quát hóa và tái sử dụng. Sau đó, hầu hết mã được lưu trữ trong cùng một folder , bên cạnh nhau. Các dự án này thường có một vài biến (chẳng hạn như khóa API để truy cập vào cloud ) và có thể sử dụng đầu vào dữ liệu động và các tính năng Terraform và HCL khác, mặc dù không nổi bật.

Là một ví dụ về cấu trúc file của cách tiếp cận này, đây là dự án mà ta sẽ xây dựng trong hướng dẫn này cuối cùng sẽ như thế nào:

. └── tf/     ├── versions.tf     ├── variables.tf     ├── provider.tf     ├── server.tf     ├── dns.tf     ├── data-sources.tf     └── external/         └── name-generator.py 

Vì dự án này sẽ triển khai một web server Apache Server và cài đặt bản ghi DNS, định nghĩa của các biến dự án, nhà cung cấp DigitalOcean Terraform, Server và bản ghi DNS sẽ được lưu trữ trong các file tương ứng của chúng. Các version nhà cung cấp Terraform và DigitalOcean được yêu cầu tối thiểu sẽ được chỉ định trong versions.tf , trong khi tập lệnh Python sẽ tạo tên cho Server (và được sử dụng làm nguồn dữ liệu động trong data-sources.tf ) sẽ được lưu trữ ở external để tách nó khỏi mã HCL.

Cấu trúc phức tạp

Trái ngược với cấu trúc đơn giản, cách tiếp cận này phù hợp với các dự án lớn, với cấu trúc folder con được xác định rõ ràng chứa nhiều module có mức độ phức tạp khác nhau, ngoài mã thông thường. Các module này có thể phụ thuộc vào nhau. Cùng với hệ thống kiểm soát version , các dự án này có thể sử dụng rộng rãi không gian làm việc. Cách tiếp cận này phù hợp với các dự án lớn hơn quản lý nhiều ứng dụng, đồng thời sử dụng lại mã nhiều nhất có thể.

Các version cơ sở hạ tầng phát triển, dàn dựng, đảm bảo chất lượng và production cũng có thể được đặt trong cùng một dự án trong các folder khác nhau bằng cách dựa trên các module chung, do đó loại bỏ mã trùng lặp và biến dự án trở thành nguồn trung tâm của sự thật. Đây là cấu trúc file của một dự án mẫu có cấu trúc phức tạp hơn, chứa nhiều ứng dụng triển khai, module Terraform và môi trường cloud mục tiêu:

. └── tf/     ├── modules/     │   ├── network/     │   │   ├── main.tf     │   │   ├── dns.tf     │   │   ├── outputs.tf     │   │   └── variables.tf     │   └── spaces/     │       ├── main.tf     │       ├── outputs.tf     │       └── variables.tf     └── applications/         ├── backend-app/         │   ├── env/         │   │   ├── dev.tfvars         │   │   ├── staging.tfvars         │   │   ├── qa.tfvars         │   │   └── production.tfvars         │   └── main.tf         └── frontend-app/             ├── env/             │   ├── dev.tfvars             │   ├── staging.tfvars             │   ├── qa.tfvars             │   └── production.tfvars             └── main.tf 

Cách tiếp cận này sẽ được khám phá thêm ở phần sau của loạt bài này.

Đến đây bạn đã biết dự án Terraform là gì, cách cấu trúc nó tốt nhất theo mức độ phức tạp được nhận thức và role của không gian làm việc Terraform. Trong các bước tiếp theo, bạn sẽ tạo một dự án với cấu trúc đơn giản sẽ cung cấp Server có cài đặt web server Apache và các bản ghi DNS được cài đặt cho domain của bạn. Trước tiên, bạn sẽ khởi tạo dự án của bạn với nhà cung cấp DigitalOcean và các biến, sau đó tiến hành xác định Server, một nguồn dữ liệu động để cung cấp tên của nó và bản ghi DNS để triển khai.

Bước 1 - Cài đặt dự án ban đầu của bạn

Trong phần này, bạn sẽ thêm nhà cung cấp DigitalOcean Terraform vào dự án của bạn , xác định các biến dự án và khai báo version nhà cung cấp DigitalOcean, để Terraform có thể kết nối với account của bạn.

Bắt đầu bằng cách tạo một folder cho dự án Terraform của bạn bằng lệnh sau:

  • mkdir ~/apache-server-terraform

Điều hướng đến nó:

  • cd ~/apache-server-terraform

Vì dự án này sẽ tuân theo phương pháp cấu trúc đơn giản, bạn sẽ lưu trữ trình cung cấp, biến, Server và mã bản ghi DNS trong các file riêng biệt, theo cấu trúc file từ phần trước. Trước tiên, bạn cần thêm nhà cung cấp DigitalOcean Terraform vào dự án của bạn dưới dạng nhà cung cấp bắt buộc.

Tạo một file có tên là versions.tf và mở file đó để chỉnh sửa bằng lệnh:

  • nano versions.tf

Thêm các dòng sau:

~ / apache-server-terraform / maps.tf
terraform {   required_providers {     digitalocean = {       source = "digitalocean/digitalocean"       version = "1.22.2"     }   }   required_version = ">= 0.13" } 

Trong khối terraform này, bạn liệt kê các nhà cung cấp cần thiết (DigitalOcean, version 1.22.2 ) và đặt version Terraform bắt buộc tối thiểu thành cao hơn hoặc bằng 0.13 . Khi bạn hoàn tất, hãy lưu file .

Sau đó, xác định các biến mà dự án của bạn sẽ hiển thị trong file variables.tf , theo cách tiếp cận lưu trữ các loại tài nguyên khác nhau trong các file mã riêng biệt:

  • nano variables.tf

Thêm các biến sau:

~ / apache-server-terraform / variable.tf
variable "do_token" {} variable "domain_name" {} 

Lưu và đóng file .

Biến do_token sẽ giữ Mã thông báo truy cập cá nhân DigitalOcean của bạn và domain_name sẽ chỉ định domain mong muốn của bạn. Server được triển khai sẽ có SSH key , được nhận dạng bằng fingerprint SSH, được cài đặt tự động.

Tiếp theo, hãy xác định version nhà cung cấp DigitalOcean cho dự án này. Bạn sẽ lưu trữ nó trong một file có tên là provider.tf . Tạo và mở nó để chỉnh sửa bằng lệnh:

  • nano provider.tf

Thêm nhà cung cấp:

~ / apache-server-terraform / provider.tf
provider "digitalocean" {   token = var.do_token } 

Lưu và thoát khi bạn hoàn tất. Bạn đã xác định nhà cung cấp digitalocean , tương ứng với nhà cung cấp bắt buộc mà bạn đã chỉ định trước đó trong provider.tf và đặt mã thông báo của nó thành giá trị của biến, sẽ được cung cấp trong thời gian chạy.

Trong bước này, bạn đã tạo một folder cho dự án của bạn , yêu cầu nhà cung cấp DigitalOcean có sẵn, khai báo các biến dự án và cài đặt kết nối với version nhà cung cấp DigitalOcean để sử dụng mã thông báo xác thực sẽ được cung cấp sau này. Đến đây bạn sẽ viết một tập lệnh sẽ tạo dữ liệu động cho các định nghĩa dự án của bạn.

Bước 2 - Tạo tập lệnh Python cho dữ liệu động

Trước khi tiếp tục xác định Server, bạn sẽ tạo một tập lệnh Python sẽ tạo tên của Server động và khai báo một tài nguyên nguồn dữ liệu để phân tích cú pháp nó. Tên sẽ được tạo bằng cách nối một chuỗi không đổi ( web ) với thời gian hiện tại của máy local , được thể hiện ở định dạng kỷ nguyên UNIX . Một kịch bản đặt tên có thể hữu ích khi nhiều Server được tạo theo một sơ đồ đặt tên, để dễ dàng phân biệt giữa chúng.

Bạn sẽ lưu trữ tập lệnh trong một file có tên name-generator.py , trong một folder có tên external . Đầu tiên, tạo folder bằng lệnh:

  • mkdir external

Thư mục external nằm trong folder root của dự án của bạn và sẽ lưu trữ các file mã không phải HCL, giống như tập lệnh Python mà bạn sẽ viết.

Tạo name-generator.py external và mở nó để chỉnh sửa:

  • nano external/name-generator.py

Thêm mã sau:

external / name-generator.py
import json, time  fixed_name = "web" result = {   "name": f"{fixed_name}-{int(time.time())}", }  print(json.dumps(result)) 

Tập lệnh Python này nhập module jsontime , khai báo result có tên từ điển và đặt giá trị của khóa name thành một chuỗi nội suy, kết hợp fixed_name với thời gian UNIX hiện tại của máy mà nó chạy. Sau đó, result được chuyển đổi thành JSON và xuất trên stdout . Đầu ra sẽ khác nhau mỗi khi tập lệnh được chạy:

Output
{"name": "web-1597747959"}

Khi bạn hoàn tất, hãy lưu file .

Lưu ý: Các dự án lớn và có cấu trúc phức tạp đòi hỏi phải suy nghĩ nhiều hơn về cách các nguồn dữ liệu bên ngoài được tạo và sử dụng, đặc biệt là về tính di động và xử lý lỗi. Terraform mong đợi chương trình được thực thi sẽ viết một thông báo lỗi mà con người có thể đọc được tới stderr và thoát một cách duyên dáng với trạng thái khác 0, đây là điều không được hiển thị trong bước này vì tính đơn giản của tác vụ. Ngoài ra, nó hy vọng chương trình không có tác dụng phụ để có thể chạy lại nhiều lần nếu cần.

Để biết thêm thông tin về những gì Terraform mong đợi, hãy truy cập tài liệu chính thức về nguồn dữ liệu.

Bây giờ tập lệnh đã sẵn sàng, bạn có thể xác định nguồn dữ liệu, nguồn này sẽ lấy dữ liệu từ tập lệnh. Bạn sẽ lưu trữ nguồn dữ liệu trong một file có tên data-sources.tf trong folder root của dự án của bạn theo phương pháp cấu trúc đơn giản.

Tạo nó để chỉnh sửa bằng lệnh:

  • nano data-sources.tf

Thêm định nghĩa sau:

~ / apache-server-terraform / data-sources.tf
data "external" "server_name" {   program = ["python3", "${path.module}/external/name-generator.py"] } 

Lưu và đóng file .

Nguồn dữ liệu này được gọi là server_name và thực thi tập lệnh name-generator.py bằng Python 3, nằm trong folder external mà bạn vừa tạo. Nó tự động phân tích cú pháp kết quả của nó và cung cấp dữ liệu được giải mã hóa dưới thuộc tính result của nó để sử dụng trong các định nghĩa tài nguyên khác.

Với nguồn dữ liệu hiện đã được khai báo, bạn có thể xác định Server mà Apache sẽ chạy trên đó.

Bước 3 - Xác định server

Trong bước này, bạn sẽ viết định nghĩa của tài nguyên Server và lưu trữ nó trong một file mã dành riêng cho Server, theo cách tiếp cận cấu trúc đơn giản. Tên của nó sẽ đến từ nguồn dữ liệu động bạn vừa tạo và sẽ khác nhau mỗi khi nó được triển khai.

Tạo và mở file server.tf để chỉnh sửa:

  • nano server.tf

Thêm định nghĩa tài nguyên Server sau:

~ / apache-server-terraform / server.tf
data "digitalocean_ssh_key" "ssh_key" {   name = "your_ssh_key_name" }  resource "digitalocean_server" "web" {   image  = "ubuntu-18-04-x64"   name   = data.external.server_name.result.name   region = "fra1"   size   = "s-1vcpu-1gb"   ssh_keys = [     data.digitalocean_ssh_key.ssh_key.id   ] } 

Trước tiên, bạn khai báo tài nguyên SSH key DigitalOcean được gọi là ssh_key , tài nguyên này sẽ tìm nạp khóa từ account của bạn theo tên của nó. Đảm bảo thay thế mã được đánh dấu bằng tên SSH key của bạn.

Sau đó, bạn khai báo một tài nguyên Server, được gọi là web . Tên thực của nó trên cloud sẽ khác, vì nó được yêu cầu từ nguồn dữ liệu bên ngoài server_name . Để khởi động tài nguyên Server bằng SSH key mỗi khi nó được triển khai, ID của ssh_key được chuyển vào tham số ssh_keys để DigitalOcean biết khóa nào cần áp dụng.

Hiện tại, đây là tất cả những gì bạn cần để cấu hình liên quan đến server.tf , vì vậy hãy lưu file khi bạn hoàn tất.

Đến đây bạn sẽ viết cấu hình cho bản ghi DNS sẽ trỏ domain của bạn đến Server vừa được khai báo.

Bước 4 - Xác định bản ghi DNS

Bước cuối cùng trong quá trình này là cấu hình bản ghi DNS trỏ tới Server từ domain của bạn.

Bạn sẽ lưu trữ cấu hình DNS trong một file có tên dns.tf , vì đó là một loại tài nguyên riêng biệt với các loại tài nguyên khác mà bạn đã tạo ở các bước trước. Tạo và mở nó để chỉnh sửa:

  • nano dns.tf

Thêm các dòng sau:

~ / apache-server-terraform / dns.tf
resource "digitalocean_record" "www" {   domain = var.domain_name   type   = "A"   name   = "@"   value  = digitalocean_server.web.ipv4_address } 

Mã này khai báo bản ghi DNS DigitalOcean tại domain của bạn (được chuyển vào bằng cách sử dụng biến), thuộc loại A Bản ghi có tên là @ , là một trình giữ chỗ định tuyến đến chính domain và với địa chỉ IP Server làm value của nó. Bạn có thể thay thế giá trị name bằng một giá trị khác, điều này sẽ dẫn đến việc tạo domain phụ.

Khi bạn hoàn tất, hãy lưu file .

Đến đây bạn đã cấu hình Server, nguồn dữ liệu trình tạo tên và bản ghi DNS, bạn sẽ chuyển sang triển khai dự án trên cloud .

Bước 5 - Lập kế hoạch và áp dụng cấu hình

Trong phần này, bạn sẽ khởi tạo dự án Terraform của bạn , triển khai nó lên cloud và kiểm tra xem mọi thứ đã được cấp chính xác chưa.

Bây giờ cơ sở hạ tầng của dự án đã được xác định hoàn chỉnh, tất cả những gì còn lại cần làm trước khi triển khai nó là khởi tạo dự án Terraform. Làm như vậy bằng cách chạy lệnh sau:

  • terraform init

Bạn sẽ nhận được kết quả sau:

Output
Initializing the backend... Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "1.22.2"... - Finding latest version of hashicorp/external... - Installing hashicorp/external v1.2.0... - Installed hashicorp/external v1.2.0 (signed by HashiCorp) - Installing digitalocean/digitalocean v1.22.2... - Installed digitalocean/digitalocean v1.22.2 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) Partner and community providers are signed by their developers. If you'd like to know more about provider signing, you can read about it here: https://www.terraform.io/docs/plugins/signing.html The following providers do not have any version constraints in configuration, so the latest version was installed. To prevent automatic upgrades to new major versions that may contain breaking changes, we recommend adding version constraints in a required_providers block in your configuration, with the constraint strings suggested below. * hashicorp/external: version = "~> 1.2.0" Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.

Như vậy, bạn có thể triển khai Server của bạn với tên được tạo động và domain đi kèm vào account DigitalOcean của bạn.

Bắt đầu bằng cách xác định domain , file tham chiếu SSH key và mã thông báo truy cập cá nhân của bạn dưới dạng các biến môi trường, vì vậy bạn sẽ không phải sao chép các giá trị mỗi khi chạy Terraform. Chạy các lệnh sau, thay thế các giá trị được đánh dấu:

  • export DO_PAT="your_do_api_token"
  • export DO_DOMAIN_NAME="your_domain"

Bạn có thể tìm thấy mã thông báo API của bạn trong Control panel DigitalOcean của bạn .

Chạy lệnh plan với các giá trị biến được truyền vào để xem Terraform sẽ thực hiện các bước nào để triển khai dự án của bạn:

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

Đầu ra sẽ tương tự như sau:

Output
Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. data.digitalocean_ssh_key.ssh_key: Refreshing state... data.external.server_name: Refreshing state... ------------------------------------------------------------------------ An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_server.web will be created + resource "digitalocean_server" "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-1597780013" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + ssh_keys = [ + "...", ] + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } # digitalocean_record.www will be created + resource "digitalocean_record" "www" { + domain = "your_domain" + fqdn = (known after apply) + id = (known after apply) + name = "@" + ttl = (known after apply) + type = "A" + value = (known after apply) } Plan: 2 to add, 0 to change, 0 to destroy. ------------------------------------------------------------------------ Note: You didn't specify an "-out" parameter to save this plan, so Terraform can't guarantee that exactly these actions will be performed if "terraform apply" is subsequently run.

Các dòng bắt đầu bằng dấu + màu xanh lục biểu thị rằng Terraform sẽ tạo từng tài nguyên theo sau — đó chính xác là những gì sẽ xảy ra, vì vậy bạn có thể apply cấu hình:

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

Đầu ra sẽ giống như trước, ngoại trừ lần này bạn cần xác nhận:

Output
Plan: 2 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: `yes`

Nhập yes và Terraform sẽ cung cấp Server và bản ghi DNS:

Output
digitalocean_server.web: Creating... ... digitalocean_server.web: Creation complete after 33s [id=204432105] digitalocean_record.www: Creating... digitalocean_record.www: Creation complete after 1s [id=110657456] Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

Terraform hiện đã ghi lại các tài nguyên được triển khai ở trạng thái của nó. Để xác nhận các bản ghi DNS và Server đã được kết nối thành công, bạn có thể extract địa chỉ IP của Server từ trạng thái local và kiểm tra xem nó có trùng với các bản ghi DNS công cộng cho domain của bạn hay không. Chạy lệnh sau để lấy địa chỉ IP:

  • terraform show | grep "ipv4"

Bạn sẽ nhận được địa chỉ IP của Server:

Output
ipv4_address = "your_Server_IP"

Bạn có thể kiểm tra các bản ghi A công khai bằng lệnh:

  • nslookup -type=a your_domain | grep "Address" | tail -1

Đầu ra sẽ hiển thị địa chỉ IP mà bản ghi A trỏ đến:

Output
Address: your_Server_IP

Chúng giống nhau, vì chúng phải như vậy, nghĩa là bản ghi Server và DNS đã được cấp phép thành công.

Để các thay đổi trong bước tiếp theo diễn ra, hãy phá hủy các tài nguyên đã triển khai bằng lệnh:

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

Khi được yêu cầu , hãy nhập yes để tiếp tục.

Trong bước này, bạn đã tạo cơ sở hạ tầng của bạn và áp dụng nó vào account DigitalOcean của bạn . Đến đây bạn sẽ sửa đổi nó để tự động cài đặt web server Apache trên Server được cung cấp bằng cách sử dụng trình cấp phép Terraform.

Bước 6 - Chạy mã sử dụng nhà cung cấp

Đến đây bạn sẽ cài đặt cài đặt web server Apache trên Server đã triển khai của bạn bằng cách sử dụng trình remote-exec thực thi remote-exec để thực thi các lệnh tùy chỉnh.

Các trình cung cấp Terraform được dùng để thực thi các hành động cụ thể trên các tài nguyên từ xa đã tạo (trình remote-exec ) hoặc máy local mà mã đang thực thi (sử dụng trình cung cấp thực thi local-exec ). Nếu trình cấp phép không thành công, nút sẽ được đánh dấu là bị nhiễm bẩn ở trạng thái hiện tại, nghĩa là nó sẽ bị xóa và được tạo lại trong lần chạy tiếp theo.

Để kết nối với Server được cung cấp, Terraform cần có SSH key riêng của khóa được cài đặt trên Server. Cách tốt nhất để chuyển vào vị trí của private key là sử dụng các biến, vì vậy hãy mở variables.tf để chỉnh sửa:

  • nano variables.tf

Thêm dòng được đánh dấu:

~ / apache-server-terraform / variable.tf
variable "do_token" {} variable "domain_name" {} variable "private_key" {} 

Đến đây bạn đã thêm một biến mới, được gọi là private_key , vào dự án của bạn . Lưu và đóng file .

Tiếp theo, bạn sẽ thêm dữ liệu kết nối và khai báo người cung cấp từ xa vào cấu hình Server của bạn . Mở server.tf để chỉnh sửa bằng lệnh:

  • nano server.tf

Mở rộng mã hiện có với các dòng được đánh dấu:

~ / apache-server-terraform / server.tf
data "digitalocean_ssh_key" "ssh_key" {   name = "your_ssh_key_name" }  resource "digitalocean_server" "web" {   image  = "ubuntu-18-04-x64"   name   = data.external.server_name.result.name   region = "fra1"   size   = "s-1vcpu-1gb"   ssh_keys = [     data.digitalocean_ssh_key.ssh_key.id   ]    connection {     host        = self.ipv4_address     user        = "root"     type        = "ssh"     private_key = file(var.private_key)     timeout     = "2m"   }    provisioner "remote-exec" {     inline = [       "export PATH=$PATH:/usr/bin",       # Install Apache       "apt update",       "apt -y install apache2"     ]   } } 

Khối connection chỉ định cách Terraform sẽ kết nối với Server đích. Khối provisioner chứa một mảng lệnh, trong tham số inline , mà nó sẽ thực thi sau khi cấp phép. Đó là, cập nhật cache ẩn của trình quản lý gói và cài đặt Apache. Lưu và thoát khi bạn hoàn tất.

Bạn cũng có thể tạo một biến môi trường tạm thời cho đường dẫn private key :

  • export DO_PRIVATE_KEY="private_key_location"

Lưu ý: Khóa riêng tư và các file nào khác mà bạn muốn tải từ bên trong Terraform, phải được đặt trong dự án. Bạn có thể xem hướng dẫn Cách cài đặt SSH key trên Ubuntu 18.04 để biết thêm thông tin về SSH key được cài đặt trên Ubuntu 18.04 hoặc các bản phân phối khác.

Thử áp dụng lại cấu hình:

  • terraform apply -var "do_token=${DO_PAT}" -var "domain_name=${DO_DOMAIN_NAME}" -var "private_key=${DO_PRIVATE_KEY}"

Nhập yes khi được yêu cầu . Bạn sẽ nhận được kết quả tương tự như trước đây, nhưng theo sau là kết quả dài từ trình cung cấp thực thi remote-exec :

Output
digitalocean_server.web: Creating... digitalocean_server.web: Still creating... [10s elapsed] digitalocean_server.web: Still creating... [20s elapsed] digitalocean_server.web: Still creating... [30s elapsed] digitalocean_server.web: Provisioning with 'remote-exec'... digitalocean_server.web (remote-exec): Connecting to remote host via SSH... digitalocean_server.web (remote-exec): Host: ... digitalocean_server.web (remote-exec): User: root digitalocean_server.web (remote-exec): Password: false digitalocean_server.web (remote-exec): Private key: true digitalocean_server.web (remote-exec): Certificate: false digitalocean_server.web (remote-exec): SSH Agent: false digitalocean_server.web (remote-exec): Checking Host Key: false digitalocean_server.web (remote-exec): Connected! ... digitalocean_server.web: Creation complete after 1m5s [id=204442200] digitalocean_record.www: Creating... digitalocean_record.www: Creation complete after 1s [id=110666268] Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

Đến đây bạn có thể chuyển đến domain của bạn trong trình duyệt web. Bạn sẽ thấy trang chào mừng Apache mặc định.

 Web server  Apache - Trang mặc định

Điều này nghĩa là Apache đã được cài đặt thành công và Terraform đã cung cấp mọi thứ một cách chính xác.

Để hủy các tài nguyên đã triển khai, hãy chạy lệnh sau và nhập yes khi được yêu cầu :

  • terraform destroy -var "do_token=${DO_PAT}" -var "domain_name=${DO_DOMAIN_NAME}" -var "private_key=${DO_PRIVATE_KEY}"

Đến đây bạn đã hoàn thành một dự án Terraform nhỏ với cấu trúc đơn giản, triển khai web server Apache trên Server và cài đặt bản ghi DNS cho domain mong muốn.

Kết luận

Bạn đã học về hai cách tiếp cận chung để cấu trúc các dự án Terraform của bạn , tùy theo độ phức tạp của chúng. Sau đó, bạn đã triển khai Server chạy Apache với các bản ghi DNS cho domain của bạn , theo cách tiếp cận cấu trúc đơn giản và sử dụng trình cung cấp thực thi remote-exec để thực thi các lệnh.

Để tham khảo, đây là cấu trúc file của dự án bạn đã tạo trong hướng dẫn này:

. └── tf/     ├── versions.tf     ├── variables.tf     ├── provider.tf     ├── server.tf     ├── dns.tf     ├── data-sources.tf     └── external/         └── name-generator.py 

Các tài nguyên bạn đã xác định (Server, bản ghi DNS và nguồn dữ liệu động, nhà cung cấp DigitalOcean và các biến) được lưu trữ từng tài nguyên trong file riêng biệt của riêng nó, theo cấu trúc dự án đơn giản được nêu trong phần đầu tiên của hướng dẫn này.

Để biết thêm thông tin về bộ cung cấp Terraform và các thông số của chúng, hãy truy cập tài liệu chính thức .


Tags:

Các tin liên quan