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
Vault, của HashiCorp, là một công cụ mã nguồn mở để lưu trữ bí mật và dữ liệu nhạy cảm một cách an toàn trong môi trường đám mây động. Nó cung cấp mã hóa dữ liệu mạnh mẽ, truy cập dựa trên danh tính bằng cách sử dụng các chính sách tùy chỉnh, cho thuê và thu hồi bí mật, cũng như nhật ký kiểm tra chi tiết luôn được ghi lại. Vault cũng có API HTTP, làm cho nó trở thành lựa chọn lý tưởng để lưu trữ thông tin xác thực trong các triển khai hướng dịch vụ phân tán, chẳng hạn như Kubernetes.
Packer và Terraform, cũng được phát triển bởi HashiCorp, có thể được sử dụng cùng nhau để tạo và triển khai hình ảnh của Vault. Trong quy trình làm việc này, các nhà phát triển có thể sử dụng Packer để viết các hình ảnh bất biến cho các nền tảng khác nhau từ một tệp cấu hình duy nhất, tệp này chỉ định những gì hình ảnh phải chứa. Terraform sau đó sẽ triển khai nhiều phiên bản tùy chỉnh của các hình ảnh đã tạo nếu cần.
Trong hướng dẫn này, bạn sẽ sử dụng Packer để tạo một ảnh chụp nhanh bất biến của hệ thống đã cài đặt Vault và sắp xếp việc triển khai bằng Terraform. Cuối cùng, bạn sẽ có một hệ thống tự động để triển khai Vault, cho phép bạn tập trung vào làm việc với chính Vault chứ không phải vào quá trình cài đặt và cung cấp cơ bản.
Điều kiện tiên quyết
- Trình đóng gói được cài đặt trên máy cục bộ của bạn. Để được hướng dẫn, hãy truy cập tài liệu chính thức.
- Terraform được cài đặt trên máy cục bộ của bạn. Để đạt được điều này, hãy làm theo Bước 1 của hướng dẫn Cách sử dụng Terraform với DigitalOcean.
- Mã thông báo truy cập cá nhân (khóa API) có quyền đọc và ghi cho tài khoản DigitalOcean của bạn. Để tìm hiểu cách tạo một mã, hãy truy cập Cách tạo Mã truy cập cá nhân từ tài liệu.
- Khóa SSH bạn sẽ sử dụng để xác thực với Vault Droplets đã triển khai, có sẵn trên máy cục bộ của bạn và được thêm vào tài khoản DigitalOcean của bạn. Bạn cũng sẽ cần dấu vân tay của nó, bạn có thể sao chép dấu vân tay này từ trang Bảo mật trong tài khoản của mình sau khi bạn thêm nó. Xem tài liệu DigitalOcean để biết hướng dẫn chi tiết hoặc hướng dẫn Cách thiết lập khóa SSH.
Bước 1 – Tạo mẫu trình đóng gói
Trong bước này, bạn sẽ viết một tệp cấu hình Packer, được gọi là bản mẫu, điều đó sẽ hướng dẫn Packer về cách tạo một hình ảnh có chứa Vault được cài đặt sẵn. Bạn sẽ viết cấu hình ở định dạng JSON, một định dạng tệp cấu hình mà con người có thể đọc được.
Đối với mục đích của hướng dẫn này, bạn sẽ lưu trữ tất cả các tệp trong ~/vault-orchestration
. Tạo thư mục bằng cách chạy lệnh sau:
- mkdir ~/vault-orchestration
Điều hướng đến nó:
You'll store config files for Packer and Terraform separately, in different subdirectories. Create them using the following command:
Because you'll first be working with Packer, navigate to its directory:
Using Template Variables
Storing private data and application secrets in a separate variables file is the ideal way of keeping them out of your template. When building the image, Packer will substitute the referenced variables with their values. Hard coding secret values into your template is a security risk, especially if it's going to be shared with team members or put up on public sites, such as GitHub.
You'll store them in the packer
thư mục con, trong một tệp được gọi là variables.json
. Tạo nó bằng cách sử dụng trình soạn thảo văn bản yêu thích của bạn:
Add the following lines:
~/vault-orchestration/packer/variables.json
{
"do_token": "your_do_api_key",
"base_system_image": "ubuntu-20-04-x64",
"region": "fra1",
"size": "s-1vcpu-1gb"
}
Tệp biến bao gồm một từ điển JSON, từ điển này ánh xạ các tên biến với giá trị của chúng. Bạn sẽ sử dụng các biến này trong mẫu mà bạn sắp tạo. Nếu muốn, bạn có thể chỉnh sửa hình ảnh cơ sở, vùng và giá trị kích thước giọt theo tài liệu của nhà phát triển.
Nhớ thay your_do_api_key
bằng khóa API mà bạn đã tạo như một phần của điều kiện tiên quyết, sau đó lưu và đóng tệp.
Tạo nhà xây dựng và nhà cung cấp
Với tệp biến đã sẵn sàng, bây giờ bạn sẽ tự tạo mẫu Packer.
Bạn sẽ lưu trữ mẫu Packer cho Vault trong một tệp có tên template.json
. Tạo nó bằng cách sử dụng trình soạn thảo văn bản của bạn:
Add the following lines:
~/vault-orchestration/packer/template.json
{
"builders": [{
"type": "digitalocean",
"api_token": "{{user `do_token`}}",
"image": "{{user `base_system_image`}}",
"region": "{{user `region`}}",
"size": "{{user `size`}}",
"ssh_username": "root"
}],
"provisioners": [{
"type": "shell",
"inline": [
"sleep 30",
"sudo apt-get update",
"sudo apt-get install unzip -y",
"curl -L https://releases.hashicorp.com/vault/1.8.4/vault_1.8.4_linux_amd64.zip -o vault.zip",
"unzip vault.zip",
"sudo chown root:root vault",
"mv vault /usr/local/bin/",
"rm -f vault.zip"
]
}]
}
Trong mẫu, bạn xác định các mảng thợ xây và người dự phòng. Người xây dựng cho Packer biết cách xây dựng hình ảnh hệ thống (tùy theo loại của họ) và nơi lưu trữ nó, trong khi trình cấp phép chứa các tập hợp hành động mà Packer nên thực hiện trên hệ thống trước khi biến nó thành một hình ảnh bất biến, chẳng hạn như cài đặt hoặc cấu hình phần mềm. Nếu không có bất kỳ trình cung cấp nào, bạn sẽ có một hình ảnh hệ thống cơ sở không được chỉnh sửa. Cả người xây dựng và người cung cấp đều hiển thị các thông số để tùy chỉnh quy trình công việc hơn nữa.
Trước tiên, bạn xác định một trình tạo duy nhất của loại digitalocean
, có nghĩa là khi được lệnh xây dựng hình ảnh, Packer sẽ sử dụng các tham số được cung cấp để tạo Giọt tạm thời có kích thước xác định bằng cách sử dụng khóa API được cung cấp, với hình ảnh hệ thống cơ sở được chỉ định và trong vùng được chỉ định. Định dạng để tìm nạp một biến là {{user 'variable_name'}}
, trong đó phần được đánh dấu là tên của nó.
Khi Droplet tạm thời được cấp phép, người cung cấp sẽ kết nối với nó bằng SSH với tên người dùng được chỉ định và sẽ thực thi tuần tự tất cả các cấp phép đã xác định trước khi tạo Ảnh chụp nhanh DigitalOcean từ Droplet và xóa nó.
Người cung cấp là loại shell
, sẽ thực hiện các lệnh đã cho trên mục tiêu. Các lệnh có thể được chỉ định inline
, dưới dạng một mảng chuỗi hoặc được định nghĩa trong các tệp kịch bản riêng biệt nếu việc chèn chúng vào mẫu trở nên khó sử dụng do kích thước. Các lệnh trong mẫu sẽ đợi 30 giây để hệ thống khởi động, sau đó sẽ tải xuống và giải nén Vault 1.8.4. Kiểm tra trang tải xuống Vault chính thức và thay thế liên kết trong các lệnh bằng một phiên bản mới hơn cho Linux, nếu có.
Khi bạn hoàn tất, hãy lưu và đóng tệp.
Để xác minh tính hợp lệ của mẫu của bạn, hãy chạy lệnh sau:
- packer validate -var-file=variables.json template.json
Packer chấp nhận một đường dẫn đến tệp biến thông qua -var-file
tranh luận.
Bạn sẽ thấy kết quả sau:
Output
The configuration is valid.
Nếu bạn gặp lỗi, Packer sẽ chỉ định chính xác nơi nó xảy ra, vì vậy bạn sẽ có thể sửa nó.
Bây giờ, bạn có một mẫu làm việc tạo ra một hình ảnh có cài đặt Vault, với khóa API của bạn và các thông số khác được xác định trong một tệp riêng biệt. Bây giờ bạn đã sẵn sàng để gọi Packer và tạo ảnh chụp nhanh.
Bước 2 - Xây dựng Ảnh chụp nhanh
Trong bước này, bạn sẽ tạo Ảnh chụp nhanh DigitalOcean từ mẫu của mình bằng Trình đóng gói build
chỉ huy.
Để tạo ảnh chụp nhanh của bạn, hãy chạy lệnh sau:
- packer build -var-file=variables.json template.json
Lệnh này sẽ mất một khoảng thời gian để hoàn thành. Bạn sẽ thấy rất nhiều đầu ra, tương tự như sau:
Output
digitalocean: output will be in this color.
==> digitalocean: Creating temporary RSA SSH key for instance...
==> digitalocean: Importing SSH public key...
==> digitalocean: Creating droplet...
==> digitalocean: Waiting for droplet to become active...
==> digitalocean: Using SSH communicator to connect: ...
==> digitalocean: Waiting for SSH to become available...
==> digitalocean: Connected to SSH!
==> digitalocean: Provisioning with shell script: /tmp/packer-shell464972932
digitalocean: Hit:1 http://mirrors.digitalocean.com/ubuntu focal InRelease
...
==> digitalocean: % Total % Received % Xferd Average Speed Time Time Time Current
==> digitalocean: Dload Upload Total Spent Left Speed
==> digitalocean: 100 63.5M 100 63.5M 0 0 110M 0 --:--:-- --:--:-- --:--:-- 110M
digitalocean: Archive: vault.zip
digitalocean: inflating: vault
==> digitalocean: Gracefully shutting down droplet...
==> digitalocean: Creating snapshot: packer-1635876039
==> digitalocean: Waiting for snapshot to complete...
==> digitalocean: Destroying droplet...
==> digitalocean: Deleting temporary ssh key...
Build 'digitalocean' finished after 5 minutes 6 seconds.
==> Wait completed after 5 minutes 6 seconds
==> Builds finished. The artifacts of successful builds are:
--> digitalocean: A snapshot was created: 'packer-1635876039' (ID: 94912983) in regions 'fra1'
Trình đóng gói ghi lại tất cả các bước đã thực hiện trong khi xây dựng mẫu của bạn. Dòng cuối cùng chứa tên của ảnh chụp nhanh (chẳng hạn như packer-1635876039
) và ID của nó trong ngoặc đơn, được đánh dấu màu đỏ. Lưu ý ID của ảnh chụp nhanh của bạn, vì bạn sẽ cần nó trong bước tiếp theo.
Nếu quá trình xây dựng không thành công do lỗi API, hãy đợi vài phút rồi thử lại.
Bạn đã tạo Ảnh chụp nhanh DigitalOcean theo mẫu của mình. Ảnh chụp nhanh đã được cài đặt sẵn Vault và bây giờ bạn có thể triển khai Droplets với nó làm hình ảnh hệ thống của chúng. Trong bước tiếp theo, bạn sẽ viết cấu hình Terraform để tự động hóa việc triển khai như vậy.
Bước 3 - Viết cấu hình Terraform
Trong bước này, bạn sẽ viết cấu hình Terraform để tự động triển khai Droplet của ảnh chụp nhanh có chứa Vault mà bạn vừa tạo bằng Packer.
Trước khi viết cấu hình Terraform thực tế để triển khai Vault từ ảnh chụp nhanh đã xây dựng trước đó, trước tiên bạn cần định cấu hình nhà cung cấp DigitalOcean cho nó. Điều hướng đến terraform
thư mục con bằng cách chạy:
- cd ~/vault-orchestration/terraform
Sau đó, tạo một tệp có tên do-provider.tf
, nơi bạn sẽ lưu trữ nhà cung cấp:
Add the following lines:
~/vault-orchestration/terraform/do-provider.tf
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}
variable "do_token" {
}
variable "ssh_fingerprint" {
}
variable "instance_count" {
default = "1"
}
variable "do_snapshot_id" {
}
variable "do_name" {
default = "vault"
}
variable "do_region" {
}
variable "do_size" {
}
provider "digitalocean" {
token = var.do_token
}
Tệp này khai báo các biến tham số và cung cấp digitalocean
nhà cung cấp có khóa API. Sau đó, bạn sẽ sử dụng các biến này trong mẫu Terraform của mình, nhưng trước tiên bạn cần chỉ định giá trị của chúng. Với mục đích đó, Terraform hỗ trợ chỉ định các giá trị biến trong một tệp định nghĩa biến tương tự như Packer. Tên tệp phải kết thúc bằng .tfvars
hoặc .tfvars.json
. Sau đó, bạn sẽ chuyển tệp đó tới Terraform bằng cách sử dụng -var-file
tranh luận.
Lưu và đóng tập tin.
Tạo một tệp định nghĩa biến được gọi là definitions.tfvars
sử dụng trình soạn thảo văn bản của bạn:
Add the following lines:
~/vault-orchestration/terraform/definitions.tfvars
do_token = "your_do_api_key"
ssh_fingerprint = "your_ssh_key_fingerprint"
do_snapshot_id = your_do_snapshot_id
do_name = "vault"
do_region = "fra1"
do_size = "s-1vcpu-1gb"
instance_count = 1
Nhớ thay your_do_api_key,
your_ssh_key_fingerprint
, và your_do_snapshot_id
với khóa API tài khoản của bạn, dấu vân tay của khóa SSH và ID ảnh chụp nhanh mà bạn đã ghi nhận từ bước trước tương ứng. Các do_region
và do_size
các tham số phải có cùng giá trị như trong tệp biến Packer. Nếu bạn muốn triển khai nhiều phiên bản cùng một lúc, hãy điều chỉnh instance_count
đến giá trị mong muốn của bạn.
Khi hoàn tất, hãy lưu và đóng tệp.
Để biết thêm thông tin về nhà cung cấp DigitalOcean Terraform, hãy truy cập tài liệu chính thức.
Bạn sẽ lưu trữ cấu hình triển khai ảnh chụp nhanh Vault trong một tệp có tên deployment.tf
, Bên dưới terraform
danh mục. Tạo nó bằng cách sử dụng trình soạn thảo văn bản của bạn:
Add the following lines:
~/vault-orchestration/terraform/deployment.tf
resource "digitalocean_droplet" "vault" {
count = var.instance_count
image = var.do_snapshot_id
name = var.do_name
region = var.do_region
size = var.do_size
ssh_keys = [
var.ssh_fingerprint
]
}
output "instance_ip_addr" {
value = {
for instance in digitalocean_droplet.vault:
instance.id => instance.ipv4_address
}
description = "The IP addresses of the deployed instances, paired with their IDs."
}
Ở đây bạn xác định một nguồn thuộc loại digitalocean_droplet
được đặt tên vault
. Sau đó, bạn đặt các thông số của nó theo các giá trị biến và thêm khóa SSH (sử dụng dấu vân tay của nó) từ tài khoản DigitalOcean của bạn vào tài nguyên Droplet. Cuối cùng, bạn output
địa chỉ IP của tất cả các phiên bản mới được triển khai vào bảng điều khiển.
Lưu và đóng tập tin.
Trước khi làm bất kỳ điều gì khác với cấu hình triển khai của bạn, bạn sẽ cần khởi tạo thư mục dưới dạng một dự án Terraform:
You'll see the following output:
Output
Initializing the backend...
Initializing provider plugins...
- Finding digitalocean/digitalocean versions matching "~> 2.0"...
- Installing digitalocean/digitalocean v2.15.0...
- Installed digitalocean/digitalocean v2.15.0 (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/cli/plugins/signing.html
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
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.
Khi khởi tạo một thư mục dưới dạng một dự án, Terraform đọc các tệp cấu hình có sẵn và tải xuống các phần bổ trợ được cho là cần thiết, như đã đăng nhập trong đầu ra.
Bây giờ bạn đã có cấu hình Terraform để triển khai ảnh chụp nhanh Vault của mình đã sẵn sàng. Bây giờ bạn có thể chuyển sang xác thực nó và triển khai nó trên Droplet.
Bước 4 - Triển khai Vault bằng Terraform
Trong phần này, bạn sẽ xác minh cấu hình Terraform của mình bằng cách sử dụng validate
chỉ huy. Sau khi xác minh thành công, bạn sẽ apply
nó và kết quả là triển khai Droplet.
Chạy lệnh sau để kiểm tra tính hợp lệ của cấu hình của bạn:
You'll see the following output:
Output
Success! The configuration is valid.
Tiếp theo, chạy plan
để xem Terraform sẽ cố gắng gì khi cung cấp cơ sở hạ tầng theo cấu hình của bạn:
- terraform plan -var-file="definitions.tfvars"
Terraform chấp nhận một tệp định nghĩa có thể thay đổi thông qua -var-file
tham số.
Đầu ra sẽ tương tự như:
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.vault[0] will be created
+ resource "digitalocean_droplet" "vault" {
+ backups = false
+ created_at = (known after apply)
+ disk = (known after apply)
+ graceful_shutdown = false
+ id = (known after apply)
+ image = "94912983"
+ ipv4_address = (known after apply)
+ ipv4_address_private = (known after apply)
+ ipv6 = false
+ ipv6_address = (known after apply)
+ locked = (known after apply)
+ memory = (known after apply)
+ monitoring = false
+ name = "vault"
+ 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)
}
Plan: 1 to add, 0 to change, 0 to destroy.
Changes to Outputs:
+ instance_ip_addr = (known after apply)
...
Mau xanh +
vào đầu của resource "digitalocean_droplet" "vault"
có nghĩa là Terraform sẽ tạo một Droplet mới có tên là vault
, sử dụng các tham số theo sau. Điều này đúng, vì vậy bây giờ bạn có thể thực hiện kế hoạch bằng cách chạy terraform apply
:
- terraform apply -var-file="definitions.tfvars"
Vào yes
khi được nhắc. Sau một vài phút, Droplet sẽ hoàn tất cấp phép và bạn sẽ thấy đầ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:
# digitalocean_droplet.vault[0] will be created
+ resource "digitalocean_droplet" "vault" {
...
}
Plan: 1 to add, 0 to change, 0 to destroy.
Changes to Outputs:
+ instance_ip_addr = (known after apply)
...
digitalocean_droplet.vault[0]: Creating...
digitalocean_droplet.vault[0]: Still creating... [10s elapsed]
...
digitalocean_droplet.vault[0]: Creation complete after 44s [id=271950984]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
instance_ip_addr = {
"271950984" = "your_new_server_ip"
}
Trong đầu ra, Terraform ghi lại những hành động mà nó đã thực hiện (trong trường hợp này là tạo Droplet) và hiển thị địa chỉ IP công khai của nó ở cuối. Bạn sẽ sử dụng nó để kết nối với Droplet mới của mình trong bước tiếp theo.
Bạn đã tạo một Giọt mới từ ảnh chụp nhanh chứa Vault và hiện đã sẵn sàng để xác minh.
Bước 5 - Xác minh giọt đã triển khai của bạn
Trong bước này, bạn sẽ truy cập Droplet mới của mình bằng SSH và xác minh rằng Vault đã được cài đặt đúng cách.
Nếu đang sử dụng Windows, bạn có thể sử dụng phần mềm như Kitty hoặc Putty để kết nối với Droplet bằng khóa SSH.
Trên máy Linux và macOS, bạn có thể sử dụng ssh
lệnh để kết nối:
Bài giải yes
khi được nhắc. Khi bạn đã đăng nhập, hãy chạy Vault bằng cách thực hiện:
You'll see its “help” output, which looks like this:
Output
Usage: vault <command> [args]
Common commands:
read Read data and retrieves secrets
write Write data, configuration, and secrets
delete Delete secrets and configuration
list List data or secrets
login Authenticate locally
agent Start a Vault agent
server Start a Vault server
status Print seal and HA status
unwrap Unwrap a wrapped secret
Other commands:
audit Interact with audit devices
auth Interact with auth methods
debug Runs the debug command
kv Interact with Vault's Key-Value storage
lease Interact with leases
namespace Interact with namespaces
operator Perform operator-specific tasks
path-help Retrieve API help for paths
plugin Interact with Vault plugins and catalog
policy Interact with policies
print Prints runtime configurations
secrets Interact with secrets engines
ssh Initiate an SSH session
token Interact with tokens
Bạn có thể thoát kết nối bằng cách nhập exit
.
Bây giờ, bạn đã xác minh rằng Droplet mới được triển khai của bạn được tạo từ ảnh chụp nhanh bạn đã thực hiện và Vault đã được cài đặt đúng cách.
Để phá hủy các tài nguyên được cung cấp, hãy chạy lệnh sau, nhập yes
khi được nhắc:
- terraform destroy -var-file="definitions.tfvars"
Phần kết luận
Giờ đây, bạn có một hệ thống tự động để triển khai Hashicorp Vault trên DigitalOcean Droplets bằng Terraform và Packer. Giờ đây, bạn có thể triển khai bao nhiêu máy chủ Vault nếu bạn cần. Để bắt đầu sử dụng Vault, bạn sẽ cần khởi tạo nó và định cấu hình thêm. Để biết hướng dẫn về cách thực hiện điều đó, hãy truy cập tài liệu chính thức.
Để có thêm hướng dẫn sử dụng Terraform, hãy xem trang nội dung Terraform và loạt bài Cách quản lý cơ sở hạ tầng với Terraform, 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.
.