Các mô-đun Terraform cho phép bạn tổ chức mã cấu hình của mình tốt hơn và phân phối và tái sử dụng mã đó. Bạn có thể lưu trữ các mô-đun Terraform của mình trên các dịch vụ kiểm soát phiên bản từ xa, như GitHub, để những người khác sử dụng. Terraform Module Registry lưu trữ các mô-đun cộng đồng mà bạn có thể tái sử dụng cho các cấu hình Terraform của riêng bạn hoặc bạn có thể xuất bản các mô-đun của riêng mình để cộng đồng Terraform sử dụng.
Trong hướng dẫn này, bạn sẽ tạo một mô-đun Tường lửa Linode khai báo các cấu hình Tường lửa đám mây thường dùng. Sau đó, bạn sẽ sử dụng mô-đun để tạo một phiên bản Linode và gán Linode cho Tường lửa đám mây. Bạn có thể áp dụng các cấu hình ví dụ trong hướng dẫn này để tạo các cấu hình Tường lửa đám mây có thể tái sử dụng của riêng bạn. Để biết thêm thông tin về Tường lửa đám mây, hãy xem tài liệu Tường lửa đám mây .
Trước khi bạn bắt đầu
- Nếu bạn mới sử dụng Terraform, hãy đọc hướng dẫn về Terraform dành cho người mới bắt đầu của chúng tôi để làm quen với các khái niệm chính.
- Xem mục Tạo mô-đun Terraform để hiểu sâu hơn về cấu trúc mô-đun chuẩn của Terraform và các thông tin chi tiết hữu ích khác.
- Bạn cần mã thông báo truy cập cá nhân API Linode để sử dụng với Terraform. Mã thông báo này sẽ cho phép bạn tạo, cập nhật và hủy tài nguyên Linode. Xem hướng dẫn Quản lý mã thông báo truy cập cá nhân để biết các bước tạo mã thông báo.Ghi chú
When you create a personal access token ensure that you set **Read/Write** access permissions for Linode instances and Cloud Firewalls.
- Cài đặt Terraform trên máy tính cục bộ của bạn.Ghi chúHướng dẫn này được viết bằng Terraform phiên bản 0.13.0 .
- Cài đặt Git trên máy tính của bạn và hoàn tất các bước trong phần Cấu hình Git của hướng dẫn Bắt đầu với Git .
Tạo mô-đun tường lửa đám mây của bạn
Các bước sau đây sẽ tạo mô-đun Cloud Firewalls, bao gồm một số mô-đun con chia nhỏ các tài nguyên cần thiết giữa mô-đun gốc , một inbound_ssh
mô-đun, một mysql
mô-đun và một web-server
mô-đun. Mô-đun gốc là thư mục chứa các tệp cấu hình Terraform được áp dụng để xây dựng cơ sở hạ tầng mong muốn của bạn. Các tệp này cung cấp điểm vào bất kỳ mô-đun con nào. Mỗi mô-đun con sử dụng tài linode_firewall
nguyên để tạo các quy tắc Cloud Firewall có thể tái sử dụng cho các trường hợp sử dụng cụ thể.
Ghi chú: Bạn có thể áp dụng tối đa ba Tường lửa đám mây cho mỗi phiên bản Linode.Ghi chúBạn có thể xem các tệp được tạo trong suốt hướng dẫn này trong kho lưu trữ GitHub của tác giả . Bạn có thể sao chép kho lưu trữ và sử dụng nó làm nền tảng để tạo mô-đun Tường lửa đám mây tùy chỉnh của riêng bạn.
Tạo cấu trúc thư mục của mô-đun của bạn
Trong phần này, bạn sẽ tạo cấu trúc thư mục được nêu dưới đây, chứa các tệp cấu hình mô-đun và mô-đun con mà bạn sẽ tạo ở các bước sau.
main_firewalls/
├── main.tf
├── outputs.tf
├── secrets.tfvars
├── terraform
├── terraform.tfvars
├── variables.tf
└── modules/
├── inbound_ssh/
├── main.tf
├── variables.tf
└── outputs.tf
└── mysql/
├── main.tf
├── variables.tf
└── outputs.tf
└── web_server/
├── main.tf
├── variables.tf
└── outputs.tf
1.Di chuyển vào terraform
thư mục của bạn.
cd ~/terraform
2.Từ terraform
thư mục của bạn, hãy tạo cấu trúc thư mục được nêu ở trên.
mkdir -p main_firewalls/modules/{inbound_ssh,mysql,web_server}
Ghi chú
If you followed our [install Terraform](/docs/guides/how-to-build-your-infrastr
Tạo Mô-đun Con SSH Đến
Khi áp dụng cho cấu hình Terraform, inbound_ssh
mô-đun sẽ tạo Tường lửa đám mây với các quy tắc đến để cho phép TCP
kết nối đến cổng 22
từ mọi nguồn. Cổng 22
thường được sử dụng cho kết nối shell an toàn (SSH), đăng nhập an toàn, truyền tệp (scp, sftp) và chuyển tiếp cổng.
1.Sử dụng trình soạn thảo văn bản ưa thích của bạn, tạo tệp inbound_ssh
mô-đun main.tf
. Sao chép và lưu nội dung của ví dụ bên dưới.
terraform {
required_providers {
linode = {
source = "linode/linode"
version = "1.16.0"
}
}
}
resource "linode_firewall" "ssh_inbound" {
label = var.firewall_label
tags = var.tags
inbound {
protocol = "TCP"
ports = ["22"]
addresses = ["0.0.0.0/0"]
}
linodes = var.linodes
}
- Tệp này sử dụng tài nguyên của Nhà cung cấp Terraform Linode
linode_firewall
để tạo Tường lửa đám mây với các quy tắc đến được mô tả ở trên. - Đối
linodes
số mong đợi một danh sách ID Linode. Khi ID Linode được truyền cholinodes
đối số,inbound_ssh
tường lửa sẽ được gán cho ID đó. - Các đối số
label
,tags
, vàlinodes
sử dụng các biến đầu vào , cho phép tùy chỉnh các giá trị này khi sử dụng mô-đun cho cấu hình tài nguyên của bạn.
2.Tạo variables.tf
tệp để khai báo inbound_ssh
các biến đầu vào của mô-đun. Sao chép và lưu nội dung của ví dụ bên dưới.
variable "linodes" {
description = "List of Linode ids to which the rule sets will be applied"
type = list(string)
default = []
}
variable "firewall_label" {
description = "This firewall's human-readable firewall_label"
type = string
default = "my-firewall"
}
variable "tags" {
description = "List of tags to apply to this Firewall"
type = list(string)
default = []
}
Các biến đầu vào được khai báo trong tệp này tương ứng với linode_firewalls
các đối số tài nguyên mà inbound_ssh
mô-đun đưa ra để tùy chỉnh. Tương tự như vậy, bạn có thể đưa ra các đối số khác nhau cho các mô-đun con Cloud Firewall của mình khi cần.
Tạo mô-đun con MySQL
Mô mysql
-đun con tạo ra một Tường lửa đám mây với một quy tắc gửi đến thường phù hợp với các kết nối máy khách đến máy chủ cơ sở dữ liệu MySQL. Quy tắc gửi đến cho phép TCP
kết nối đến cổng 3306
. addressses
Đối số chấp nhận một biến đầu vào để có thể tùy chỉnh nhằm hạn chế quyền truy cập vào một địa chỉ IP cụ thể hoặc khối CIDR.
1.Sử dụng trình soạn thảo văn bản ưa thích của bạn, tạo tệp inbound_ssh
mô-đun main.tf
. Sao chép và lưu nội dung của ví dụ bên dưới.
terraform {
required_providers {
linode = {
source = "linode/linode"
version = "1.16.0"
}
}
}
resource "linode_firewall" "mysql" {
label = var.firewall_label
tags = var.tags
inbound {
protocol = "TCP"
ports = ["3306"]
addresses = var.addresses
}
linodes = var.linodes
}
- Tệp này sử dụng tài nguyên của Nhà cung cấp Terraform Linode
linode_firewall
để tạo Tường lửa đám mây với các quy tắc đến được mô tả ở trên. - Đối
linodes
số mong đợi một danh sách ID Linode. Khi ID Linode được truyền cholinodes
đối số,mysql
tường lửa sẽ được gán cho ID đó. - Các đối số
label
,tags
,linodes
, vàaddresses
sử dụng các biến đầu vào , cho phép tùy chỉnh các giá trị này khi sử dụng mô-đun cho cấu hình tài nguyên của bạn.
2.Tạo variables.tf
tệp để khai báo inbound_ssh
các biến đầu vào của mô-đun. Sao chép và lưu nội dung của ví dụ bên dưới.
variable "linodes" {
description = "List of Linode ids to which the rule sets will be applied"
type = list(string)
default = []
}
variable "firewall_label" {
description = "This firewall's human-readable firewall_label"
type = string
default = "my-firewall"
}
variable "tags" {
description = "List of tags to apply to this Firewall"
type = list(string)
default = []
}
variable "addresses" {
description = "A list of IP addresses, CIDR blocks, or 0.0.0.0/0 (to allow all) this rule applies to."
type = list(string)
default = ["0.0.0.0/0"]
}
Các biến đầu vào được khai báo trong tệp này tương ứng với linode_firewalls
các đối số tài nguyên mà mysql
mô-đun đưa ra để tùy chỉnh.
Tạo Mô-đun con của Máy chủ Web
Khi được áp dụng, mô web_server
-đun con sẽ tạo ra Tường lửa đám mây với các quy tắc vào và ra cho phép các kết nối vào và ra từ mọi nguồn và đích đến đến các cổng 80
và 443
qua TCP
. Các cổng này thường được liên kết với HTTP và HTTPS .
1.Sử dụng trình soạn thảo văn bản ưa thích của bạn, tạo tệp web_server
mô-đun main.tf
. Sao chép và lưu nội dung của ví dụ bên dưới.
terraform {
required_providers {
linode = {
source = "linode/linode"
version = "1.16.0"
}
}
}
resource "linode_firewall" "web_server" {
label = var.firewall_label
tags = var.tags
inbound {
protocol = "TCP"
ports = ["80"]
addresses = ["0.0.0.0/0"]
}
outbound {
protocol = "TCP"
ports = ["80"]
addresses = ["0.0.0.0/0"]
}
inbound {
protocol = "TCP"
ports = ["443"]
addresses = ["0.0.0.0/0"]
}
outbound {
protocol = "TCP"
ports = ["443"]
addresses = ["0.0.0.0/0"]
}
linodes = var.linodes
}
- Tệp này sử dụng tài nguyên của Nhà cung cấp Terraform Linode
linode_firewall
để tạo Tường lửa đám mây với các quy tắc đến và đi được mô tả ở trên. - Đối
linodes
số mong đợi một danh sách ID Linode. Khi ID Linode được truyền cholinodes
đối số,web_server
tường lửa sẽ được gán cho ID đó. - Các đối số
label
,tags
, vàlinodes
sử dụng các biến đầu vào , cho phép tùy chỉnh các giá trị này khi sử dụng mô-đun cho cấu hình tài nguyên của bạn.
2.Tạo variables.tf
tệp để khai báo web_server
các biến đầu vào của mô-đun. Sao chép và lưu nội dung của ví dụ bên dưới.
variable "linodes" {
description = "List of Linode ids to which the rule sets will be applied"
type = list(string)
default = []
}
variable "firewall_label" {
description = "This firewall's human-readable firewall_label"
type = string
default = "my-firewall"
}
variable "tags" {
description = "List of tags to apply to this Firewall"
type = list(string)
default = []
}
- Các biến đầu vào được khai báo trong tệp này tương ứng với
linode_firewalls
các đối số tài nguyên màweb_server
mô-đun đưa ra để tùy chỉnh.
Tạo mô-đun gốc
Bây giờ tất cả các mô-đun con của Cloud Firewall đã được tạo, bạn có thể tạo mô-đun gốc của mình. Mô-đun gốc chịu trách nhiệm xác định cơ sở hạ tầng sẽ được Terraform xây dựng. Mô-đun gốc có quyền truy cập vào tất cả các mô-đun con và có thể sử dụng tất cả hoặc không sử dụng mô-đun nào trong số chúng. Trong phần này, bạn sẽ tạo một mô-đun gốc có thể tạo Cloud Firewall bằng các quy tắc được xác định trong web_server
mô-đun con. Nó cũng tạo hai phiên bản Linode và chỉ định Cloud Firewall cho cả hai phiên bản Linode.
1.Sử dụng trình soạn thảo văn bản ưa thích của bạn, tạo tệp mô-đun gốc main.tf
. Sao chép và lưu nội dung của ví dụ bên dưới.
terraform {
required_providers {
linode = {
source = "linode/linode"
version = "1.16.0"
}
}
}
provider "linode" {
api_version = "v4beta"
token = var.token
}
locals {
key = var.key
linode_ids = linode_instance.linode_base[*].id
}
module "firewalls_web" {
source = "./modules/web_server"
firewall_label = var.firewall_label_map["web"]
tags = var.tags
linodes = local.linode_ids
}
resource "linode_sshkey" "main_key" {
label = var.key_label
ssh_key = chomp(file(local.key))
}
resource "linode_instance" "linode_base" {
count = var.linode_count
image = var.image
label = "${var.label}_${count.index}"
region = var.region
type = var.type
authorized_keys = [ linode_sshkey.main_key.ssh_key ]
root_pass = var.root_pass
}
- Khối này
provider
là yêu cầu bắt buộc để sử dụng nhà cung cấp Linode. Vì Cloud Firewall hiện đang trong giai đoạn beta mở, bạn phải sử dụngapi_version
đối số để yêu cầu Terraform sử dụng điểm cuối API beta v4 của Linode . - Khối này
locals
khai báo một biến cục bộkey
có giá trị sẽ được cung cấp bởi một biến đầu vào.linode_ids
Biến cục bộ được sử dụng bởiweb_server
phiên bản mô-đun trong khối tiếp theo để lấy ID Linode cho các Linode được chỉ định cho Cloud Firewall sẽ được tạo. - Khối này
module "firewalls_web"
tạo ra một phiên bản củaweb_server
mô-đun con, khi áp dụng sẽ tạo ra một Cloud Firewall mới với các cấu hình do mô-đun con cung cấp và các giá trị biến đầu vào mà bạn sẽ cung cấp ở bước sau. - Đối số này
source
cung cấp vị trí của mã nguồn mô-đun con và là bắt buộc bất cứ khi nào bạn tạo một phiên bản của mô-đun. - Tất cả các đối số khác được xác định bởi mô-đun con. Vì
web_server
mô-đun con hiển thị các giá trịfirewall_label
,tags
, vàlinodes
, phải được cung cấp cho chúng. Các biến đầu vào được sử dụng trong mô-đun gốc để làm cho nó có thể tái sử dụng. Tùy thuộc vào mô-đun con mà bạn đang sử dụng và nhãn bạn muốn gán cho Cloud Firewall, bạn nên thay thế giá trị khóa chovar.firewall_label_map["web"]
. Tham khảo tệpvariables.tf
để biết chi tiết. - Đối
linodes
số lấy giá trị của nó từ biến cục bộ được xác định trong khối trước đó. - Tài
linode_sshkey
nguyên sẽ tạo Linode SSH Keys được liên kết với tài khoản Linode của bạn. Các khóa này có thể được sử dụng lại cho các lần triển khai Linode trong tương lai sau khi tài nguyên đã được tạo. ssh_key = chomp(file(local.key))
sử dụng hàm tích hợp của Terraformfile()
để cung cấp đường dẫn tệp cục bộ đến vị trí khóa SSH công khai của bạn. Vị trí của đường dẫn tệp là giá trị của biến cục bộkey
.chomp()
Hàm tích hợp xóa các dòng mới theo sau khỏi khóa SSH.- Tài nguyên này
linode_instance
tạo ra hai phiên bản Linode với các cấu hình được cung cấp bởi các đối số của nó. - Đối số này
count
kiểm soát số lượng phiên bản Linode sẽ được tạo bằng các cấu hình được cung cấp trong các đối số của khối tài nguyên. - Vì nhãn Linode phải là duy nhất nên
label
đối số sẽ tạo nhãn dựa trên giá trị được cung cấp chovar.label
biến đầu vào và số chỉ mục biểu thị phiên bản Linode được tạo. - Đối
authorized_keys
số sử dụng khóa công khai SSH dolinode_sshkey
tài nguyên trong khối tài nguyên trước đó cung cấp.
2.Tạo variables.tf
tệp để khai báo các biến đầu vào của mô-đun gốc. Các biến đầu vào này là sự kết hợp của tất cả các giá trị được yêu cầu bởi các tài nguyên khác nhau được sử dụng trong tệp main.tf
. Bạn có thể cập nhật các giá trị mặc định theo sở thích của riêng bạn.
variable "token" {
description = " Linode API token"
}
variable "key" {
description = "Public SSH Key's path."
}
variable "key_label" {
description = "New SSH key label."
}
variable "linode_count" {
description = "The number of Linode instances to deploy."
type = number
default = 1
}
variable "image" {
description = "Image to use for Linode instance."
default = "linode/ubuntu18.04"
}
variable "label" {
description = "The Linode's label is for display purposes only, but must be unique."
default = "default-linode"
}
variable "region" {
description = "The region where your Linode will be located."
default = "us-east"
}
variable "type" {
description = "Your Linode's plan type."
default = "g6-standard-1"
}
variable "root_pass" {
description = "Your Linode's root user's password."
}
variable "linodes" {
description = "List of Linode ids to which the rule sets will be applied"
type = list(string)
default = []
}
variable "firewall_label_map" {
type = "map"
default = {
"web" = "firewall_web_server"
"mysql" = "firewall_mysql"
"ssh" = "firewall_ssh"
}
}
variable "tags" {
description = "List of tags to apply to this Firewall"
type = list(string)
default = []
}
Khai báo biến cho firewall_label_map
, theo mặc định, tạo một bản đồ với các khóa mặc định web
là , mysql
, và ssh
. Bạn có thể sử dụng các khóa này để cung cấp các giá trị mặc định của bản đồ cho firewall_label
đối số. Ngoài ra, bạn có thể ghi đè các giá trị mặc định trong tệp terraform.tfvars
mà bạn sẽ tạo ở bước sau.
3.Tạo outputs.tf
tệp. Tệp này hiển thị ID của các phiên bản Linode được tạo bởi linode_instance
khối tài nguyên và sẽ được in ra bảng điều khiển của bạn khi cấu hình của mô-đun gốc được áp dụng.
output "linode_id" {
value = linode_instance.linode_base[*].id
}
4.Tạo terraform.tfvars
tệp để cung cấp giá trị cho tất cả các biến đầu vào được xác định trong variables.tf
tệp. Tệp này sẽ loại trừ bất kỳ giá trị nào cung cấp dữ liệu nhạy cảm, như mật khẩu và mã thông báo API. Một tệp chứa các giá trị nhạy cảm sẽ được tạo ở bước tiếp theo. Bạn có thể thay thế bất kỳ giá trị nào trong số này bằng giá trị của riêng bạn.
key = "~/.ssh/id_rsa.pub"
linode_count = 3
key_label = "my-ssh-key"
label = "linode"
tags = ["my-example-tag"]
firewall_label_map = {
"web" = "firewall_webserver_http_https"
}
5.Tạo một tệp có tên secrets.tfvars
để lưu trữ bất kỳ giá trị nhạy cảm nào. Thay thế các giá trị ví dụ bằng giá trị của riêng bạn.
token = "my-api-v4-token"
root_pass = "my-super-strong-root-password"
Ghi chú: Tệp này không bao giờ được theo dõi trong phần mềm kiểm soát phiên bản và phải được liệt kê trong .gitignore
tệp của bạn nếu sử dụng GitHub.
Bây giờ bạn đã sẵn sàng áp dụng main_firewalls
cấu hình Terraform của mô-đun. Các bước này sẽ được hoàn tất trong phần tiếp theo.
Khởi tạo, lập kế hoạch và áp dụng cấu hình Terraform
Bất cứ khi nào một nhà cung cấp mới được sử dụng trong cấu hình Terraform, trước tiên nó phải được khởi tạo. Quá trình khởi tạo sẽ tải xuống và cài đặt plugin của nhà cung cấp và thực hiện bất kỳ bước nào khác cần thiết để sử dụng plugin đó. Trước khi áp dụng cấu hình của bạn, việc xem kế hoạch thực hiện cấu hình của bạn trước khi thực hiện bất kỳ thay đổi thực tế nào đối với cơ sở hạ tầng của bạn cũng rất hữu ích. Trong phần này, bạn sẽ hoàn thành tất cả các bước này.
1.Khởi tạo nhà cung cấp Linode. Đảm bảo bạn đang ở trong linode_stackscripts
thư mục trước khi chạy lệnh này:
terraform init
Bạn sẽ thấy một thông báo xác nhận rằng plugin của nhà cung cấp đã được khởi tạo thành công.
2.Chạy lệnh Terraform plan:
terraform plan -var-file="secrets.tfvars" -var-file="terraform.tfvars"
Kế hoạch Terraform sẽ không thực hiện bất kỳ hành động nào hoặc thực hiện bất kỳ thay đổi nào trên tài khoản Linode của bạn. Thay vào đó, một phân tích được thực hiện để xác định hành động nào (tức là tạo, xóa hoặc sửa đổi phiên bản Linode) là cần thiết để đạt được trạng thái được mô tả trong cấu hình của bạn.
2.Bây giờ bạn đã sẵn sàng để tạo cơ sở hạ tầng được xác định trong tệp cấu hình mô-đun gốc của mình main.tf
:
terraform apply -var-file="secrets.tfvars" -var-file="terraform.tfvars"
Vì bạn đang sử dụng nhiều tệp giá trị biến, bạn phải gọi từng tệp riêng lẻ bằng var-file
đối số. Bạn sẽ được nhắc xác nhậ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 đã xác định trong suốt hướng dẫn này. Quá trình này sẽ mất vài phút để hoàn tất. Sau khi cơ sở hạ tầng được xây dựng thành công, bạn sẽ thấy đầu ra tương tự:
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
4.Bạn có thể xác minh Tường lửa đám mây của mình đã được tạo và áp dụng cho phiên bản Linode mới hay chưa bằng cách đăng nhập vào Trình quản lý đám mây Linode và điều hướng đến phần Tường lửa của trình quản lý.
Các bước tiếp theo
Để tìm hiểu cách kiểm soát phiên bản mô main-firewalls
-đun mà bạn đã tạo trong hướng dẫn này, hãy xem hướng dẫn Tạo mô-đun Terraform .
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/how-to-deploy-secure-linodes-using-cloud-firewalls-and-terraform/