Walrus là một nền tảng quản lý ứng dụng mã nguồn mở, tập trung vào kỹ thuật nền tảng, nhằm giải quyết những thách thức cốt lõi trong lĩnh vực cung cấp ứng dụng. Walrus giúp mở rộng khả năng và các thực tiễn tốt nhất của cloud-native sang môi trường không chứa container, hỗ trợ điều phối và triển khai thống nhất cho mọi hình thức ứng dụng. Điều này giảm bớt sự phức tạp khi sử dụng cơ sở hạ tầng, mang lại trải nghiệm quản lý và triển khai ứng dụng dễ dàng, nhất quán cho các đội ngũ phát triển và vận hành, từ đó xây dựng quy trình cung cấp phần mềm liền mạch.
Trong bài viết này, chúng tôi sẽ hướng dẫn từng bước cách tạo một mẫu (template) AWS GitLab và sử dụng Walrus để triển khai một máy chủ GitLab trên một phiên bản EC2 của AWS.
Điều kiện tiên quyết
- Một kho lưu trữ GitHub hoặc GitLab để lưu trữ các mẫu.
- Walrus đã được cài đặt (Tham khảo: https://seal-io.github.io/docs/zh/deploy/standalone ).
Tạo kho lưu trữ mới trên GitHub
- Tạo một kho lưu trữ mới trên GitHub. Chúng tôi sử dụng kho lưu trữ 'demo' cho phiên bản này.
- Clone kho lưu trữ về máy cục bộ của bạn.
git clone git@gitlab.com:seal-eyod/gitlab-on-aws.git
Tạo các tệp mẫu
Mở thư mục kho lưu trữ đã clone:
cd gitlab-on-aws
Tạo các tệp sau trong thư mục này:
- gitlab-on-aws
- main.tf
- outputs.tf
- variables.tf
- README.md
Tệp main.tf định nghĩa các tài nguyên sẽ được tạo. Trong trường hợp này, chúng tôi định nghĩa các tài nguyên để tạo một phiên bản EC2 trên AWS và chạy máy chủ GitLab trên đó.
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
data "aws_security_group" "selected" {
name = var.security_group_name
}
data "aws_subnets" "selected" {
filter {
name = "vpc-id"
values = [data.aws_security_group.selected.vpc_id]
}
}
resource "aws_instance" "gitlab" {
ami = data.aws_ami.ubuntu.id
instance_type = var.instance_type
subnet_id = data.aws_subnets.selected.ids.0
vpc_security_group_ids = [data.aws_security_group.selected.id]
key_name = var.key_name
user_data = <<-EOF
#!/bin/bash
set -ex;
public_ip=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)
curl -fsSL https://get.docker.com | bash && sudo usermod -aG docker ubuntu
docker run -d --privileged --restart=always -p 80:80 -p 443:443 \
-e GITLAB_ROOT_PASSWORD="${var.gitlab_root_password}" \
"${var.gitlab_image}"
EOF
tags = {
"Name" = "${var.gitlab_metadata_application_instance_name}-gitlab"
}
root_block_device {
volume_size = var.disk_size
}
}
resource "null_resource" "gitlab_health_check" {
depends_on = [
aws_instance.gitlab,
]
triggers = {
always_run = timestamp()
}
provisioner "local-exec" {
command = "for i in `seq 1 100`; do curl -k -s $ENDPOINT &>/dev/null && exit 0 || true; sleep 5; done; echo TIMEOUT & exit 1"
interpreter = ["/bin/sh", "-c"]
environment = {
ENDPOINT = "http://${aws_instance.gitlab.public_ip}"
}
}
}
Tệp variables.tf định nghĩa các biến được sử dụng trong mẫu. Walrus sẽ sử dụng các biến này để tạo biểu mẫu cho người dùng điền.
Walrus sử dụng @label và @group để xác định nhãn và nhóm cho các biến. @options tùy chọn được sử dụng để xác định các tùy chọn thả xuống cho biến. Nếu @options không được định nghĩa, biến sẽ hiển thị dưới dạng hộp văn bản trong biểu mẫu.
Trong ví dụ này, chúng tôi định nghĩa hai nhóm: nhóm Basic và nhóm AWS. Khi tạo dịch vụ bằng mẫu này, biểu mẫu sẽ hiển thị dưới dạng hai tab.
# @group "Basic"
variable "gitlab_image" {
type = string
description = "gitlab image"
default = "gitlab/gitlab-ce"
}
# @group "Basic"
variable "gitlab_root_password" {
type = string
description = "gitlab root password"
default = "seal123456"
sensitive = true
}
# @group "AWS"
# @options ["t3.medium", "c5.xlarge"]
variable "instance_type" {
type = string
description = "Instance type"
default = "t3.medium"
}
# @group "AWS"
variable "disk_size" {
type = number
description = "Root disk size in GiB"
default = 50
}
# @group "AWS"
variable "key_name" {
type = string
description = "AWS key name"
default = "xueying"
}
# @group "AWS"
variable "security_group_name" {
type = string
description = "Security group Name"
default = "all-open"
}
# @hidden
variable "gitlab_metadata_application_instance_name" {
type = string
description = "gitlab metadata application instance name."
default = "bar"
}
Tệp outputs.tf định nghĩa các đầu ra sẽ được hiển thị cho người dùng sau khi dịch vụ được tạo. Đầu ra của mẫu dịch vụ cũng có thể được tham chiếu bởi các dịch vụ khác. Trong ví dụ này, chúng tôi định nghĩa đầu ra gitlab_url, đây là URL của phiên bản GitLab.
output "gitlab_url" {
description = "The URL of the GitLab instance"
value = "http://${aws_instance.gitlab.public_ip}"
}
Tệp README.md là mô tả về mẫu. Nó sẽ hiển thị cho người dùng khi họ tạo dịch vụ bằng mẫu này.
Ở đây, chúng ta có thể sử dụng công cụ terraform-docs để tạo mô tả cho mẫu. Bạn cần cài đặt công cụ này trên máy tính của mình theo tài liệu dự án, sau đó chạy lệnh sau để tạo tệp README.md cho mẫu:
terraform-docs markdown . > README.md
Nội dung của tệp README.md được tạo sẽ như sau:
# Gitlab on AWS
This is a terraform module that will create a Gitlab instance on AWS.
## Providers
| Name | Version |
|------|---------|
| aws | n/a |
## Inputs
| Name | Description | Type | Default | Required |
|-------------------------------------------|--------------------------------------------|:--------:|:--------------------:|:--------:|
| gitlab_image | Gitlab image | `string` | `"gitlab/gitlab-ce"` | no |
| gitlab_root_password | Gitlab root password | `string` | `"seal123456"` | no |
| instance_type | Instance type | `string` | `"t3.medium"` | no |
| disk_size | Root disk size in GiB | `number` | `50` | no |
| security_group_name | Security group Name | `string` | `"all-open"` | no |
| gitlab_metadata_application_instance_name | gitlab metadata application instance name. | `string` | `"bar"` | no |
## Outputs
| Name | Description |
|------------|-------------|
| gitlab_url | Gitlab URL |
Commit và tạo tag phiên bản
git add .
git commit -m "add template files"
git push -u origin main
Tạo một tag cho phiên bản mẫu:
git tag v0.0.1
git push --tags
Tạo mẫu trên Walrus
- Mở Walrus trong trình duyệt và đăng nhập.
- Chọn Template trong Operations Hub, sau đó chọn mẫu bạn vừa tạo để tạo một mẫu mới. Chúng tôi đặt tên cho mẫu này là
gitlab-on-aws.
Sau khi Walrus đồng bộ hóa mẫu, bạn có thể thấy mẫu này trong Operations Hub.
Sau khi quá trình nhập hoàn tất, bạn có thể thấy mẫu trong danh sách. Lưu ý rằng mẫu này có hai phiên bản: v0.0.1 và v0.0.2.
Triển khai máy chủ GitLab trên AWS
Thêm một connector AWS trong Connectors của Operations Hub.
Thêm connector vào môi trường.
Tạo một dịch vụ bằng cách sử dụng mẫu gitlab-on-aws. Các nhóm và nhãn trong biểu mẫu giao diện người dùng được tạo động dựa trên các nhận xét tương ứng trong biến mẫu đã xác định trước đó. Các biến đầu vào được liệt kê trong tệp variables.tf của mẫu. Để quản lý lưu lượng mạng, phiên bản EC2 yêu cầu một nhóm bảo mật. Chúng ta có thể tạo một nhóm bảo mật có tên all-open để cho phép tất cả lưu lượng mạng. Để tăng cường bảo mật, bạn có thể tùy chỉnh các quy tắc khi cần.
Sau khi tạo nhóm bảo mật tại khu vực mục tiêu của AWS, bạn có thể lưu và áp dụng dịch vụ.
Sau khi triển khai hoàn tất, phiên bản GitLab sẽ được cấu hình thành công trên AWS.
URL của GitLab sẽ hiển thị trong kết quả đầu ra. Sau khi có URL, bạn có thể truy cập máy chủ GitLab của mình.