幻兽帕鲁是一款多人在线的全新开放世界生存游戏。随着游戏越来越火爆,在线人数的激增导致官方服务不稳定,影响玩家游戏体验。对于游戏玩家或者游戏运营商,有没有简单高效地在云上部署幻兽帕鲁游戏服务器方式呢?本文基于 Terraform 提供了一种自动化在阿里云上部署幻兽帕鲁的方案,用户通过简单的配置文件,即可在数分钟内完成游戏服务器的搭建。
1. 快速开始
1.1. 安装 Terraform
参阅《在本地安装和配置Terraform》一文安装并配置环境。
1.2. 配置模板 📝
在任意一个目录中创建一个 main.tf
文件,将如下内容写入其中:
provider "alicloud" { region ="cn-hangzhou"} variable "name" { default ="terraform-palworld"} data "alicloud_zones""example" { available_resource_creation ="Instance"} resource "alicloud_vpc""example" { vpc_name = var.name cidr_block ="10.4.0.0/16"} resource "alicloud_vswitch""example" { vswitch_name = var.name cidr_block ="10.4.0.0/24" vpc_id = alicloud_vpc.example.id zone_id = data.alicloud_zones.example.zones.0.id } resource "alicloud_security_group""example" { name = var.name vpc_id = alicloud_vpc.example.id } resource "alicloud_security_group_rule""allow_all_tcp" { type ="ingress" ip_protocol ="all" nic_type ="intranet" policy ="accept" port_range ="8211" priority =1 security_group_id = alicloud_security_group.example.id cidr_ip ="0.0.0.0/0"} data "alicloud_instance_types""enhance" { availability_zone = data.alicloud_zones.example.zones.0.id cpu_core_count =8 memory_size =32} data "alicloud_images""example" { name_regex ="^ubuntu_[0-9]+_[0-9]+_x64*" owners ="system"} resource "alicloud_instance""enhance" { availability_zone = data.alicloud_zones.example.zones.0.id instance_name ="terraform-palworld" image_id = data.alicloud_images.example.images.0.id instance_type = data.alicloud_instance_types.enhance.instance_types.0.id security_groups = [alicloud_security_group.example.id] vswitch_id = alicloud_vswitch.example.id user_data ="IyEvYmluL2Jhc2gKY2F0Pmluc3RhbGwuc2g8PEVPRgojIS9iaW4vYmFzaApzdGVhbV91c2VyPXN0ZWFtCmxvZ19wYXRoPS90bXAvcGFsX3NlcnZlci5sb2cKc3VkbyB1c2VyYWRkIC1tIC1zIC9iaW4vYmFzaCBcJHN0ZWFtX3VzZXIKc3VkbyBhZGQtYXB0LXJlcG9zaXRvcnkgbXVsdGl2ZXJzZSAteSA+IFwkbG9nX3BhdGgKc3VkbyBkcGtnIC0tYWRkLWFyY2hpdGVjdHVyZSBpMzg2ID4+IFwkbG9nX3BhdGgKc3VkbyBhcHQgdXBkYXRlIC15ID4+IFwkbG9nX3BhdGgKc3VkbyBhcHQtZ2V0IHJlbW92ZSBuZWVkcmVzdGFydCAteSA+PiBcJGxvZ19wYXRoCmVjaG8gc3RlYW0gc3RlYW0vbGljZW5zZSBub3RlICcnIHwgc3VkbyBkZWJjb25mLXNldC1zZWxlY3Rpb25zIAplY2hvIHN0ZWFtIHN0ZWFtL3F1ZXN0aW9uIHNlbGVjdCAiSSBBR1JFRSIgfCBzdWRvIGRlYmNvbmYtc2V0LXNlbGVjdGlvbnMgCnN1ZG8gYXB0IGluc3RhbGwgc3RlYW1jbWQgLXkgPj4gXCRsb2dfcGF0aApzdWRvIGVjaG8gInN0ZWFtICAgQUxMPShBTEw6QUxMKSBBTEwiID4+IC9ldGMvc3Vkb2VycwpzdWRvIGxuIC1zIC91c3IvZ2FtZXMvc3RlYW1jbWQgL3Vzci9iaW4vc3RlYW1jbWQKc3RlYW1jbWQgK3F1aXQKc3RlYW1fdXNlcl9wYXRoPS9ob21lL3N0ZWFtCnN0ZWFtY21kX3BhdGg9XCQod2hpY2ggc3RlYW1jbWQpCnN1ZG8gLXUgXCRzdGVhbV91c2VyIG1rZGlyIC1wIFwkc3RlYW1fdXNlcl9wYXRoLy5zdGVhbS9zZGs2NC8gPj4gXCRsb2dfcGF0aApzdWRvIC11IFwkc3RlYW1fdXNlciBcJHN0ZWFtY21kX3BhdGggK2xvZ2luIGFub255bW91cyArYXBwX3VwZGF0ZSAyMzk0MDEwIHZhbGlkYXRlICtxdWl0ID4+IFwkbG9nX3BhdGgKc3VkbyAtdSBcJHN0ZWFtX3VzZXIgY3AgXCRzdGVhbV91c2VyX3BhdGgvU3RlYW0vc3RlYW1hcHBzL2NvbW1vbi9QYWxTZXJ2ZXIvbGludXg2NC8qIFwkc3RlYW1fdXNlcl9wYXRoLy5zdGVhbS9zZGs2NC8Kc3VkbyAtdSBcJHN0ZWFtX3VzZXIgbm9odXAgL2hvbWUvc3RlYW0vU3RlYW0vc3RlYW1hcHBzL2NvbW1vbi9QYWxTZXJ2ZXIvUGFsU2VydmVyLnNoID4+IFwkbG9nX3BhdGgKRU9G"} resource "alicloud_eip_address""enhance" { address_name ="terraform-palworld" bandwidth =100} resource "alicloud_eip_association""enhance" { allocation_id = alicloud_eip_address.enhance.id instance_id = alicloud_instance.enhance.id } output "ip_address" { value = alicloud_eip_address.enhance.ip_address } resource "alicloud_ecs_command""command" { name ="start-palworld"# base64 encode: nohup sudo bash /install.sh & command_content ="bm9odXAgc3VkbyBiYXNoIC9pbnN0YWxsLnNoICY=" description ="For Terraform Palworld" type ="RunShellScript" working_dir ="/root"} resource "alicloud_ecs_invocation""run-command" { command_id = alicloud_ecs_command.command.id instance_id = [alicloud_instance.enhance.id] }
1.3. 一键启动 🚀
在命令行中执行 terraform apply -auto-approve
,之后只需要等待半分钟左右,恭喜你拥有一个幻兽帕鲁的游戏私服器!命令行中最后一行输出了公网IP地址即服务端的地址:
在游戏客户端中将上一步骤中输出的IP地址填入:
点击连接后即可登陆到游戏中同好友一起愉快玩耍 ~
1.4. 一键释放 ♻️
在命令行中执行 terraform destroy
,即可轻松、自动地销毁所有云上资源,不会有任何资源残留:
2. 实现过程
Terraform 是一个广泛使用的 IaC 工具,它允许开发者通过代码描述和管理基础设施资源,不同的 Provider 集成了不同云厂商的 OpenAPI 服务:
阿里云是 Hashicorp Terraform 的重要合作伙伴之一,目前阿里云的 Terraform Provider 已覆盖一百二十多款产品、七百多个资源类型,在覆盖度上已经基本涵盖了云产品的各类服务。本教程使用阿里云 Terraform Provider 进行游戏服务器的自动化部署。
2.1. 架构规划
作为一个简单的教学案例,本架构采用单地域单可用区部署(如图所示的右侧链路),在一个可用区中部署了ECS实例作为游戏服务器。该架构利用专有网络 VPC、交换机和安全组以及 EIP 等基础设施,实现了公网环境下的系统通信。如果考虑长期运营和持续发展,可以考虑基于CLB的负载均衡,随着业务压力变大增加计算资源(如图左侧所示)。
2.2. 代码实现
完成云上的基础设施架构规划后,即可到 阿里云 Terraform 文档中心 寻找需要资源类型使用文档。以 EIP 产品下的资源 alicloud_eip_association
为例,文档详细地给出了该资源类型属性说明和示例:
除了创建云上基础设施,我们还需要在创建出来的 ECS 实例中部署游戏服务程序以提供游戏服务。这里用到的游戏安装脚本如下:
steam_user=steam log_path=/tmp/pal_server.log sudo useradd -m-s /bin/bash $steam_usersudo add-apt-repository multiverse -y > $log_pathsudo dpkg --add-architecture i386 >> $log_pathsudo apt update -y >> $log_pathsudo apt-get remove needrestart -y >> $log_pathecho steam steam/license note '' | sudo debconf-set-selections echo steam steam/question select "I AGREE" | sudo debconf-set-selections sudo apt install steamcmd -y >> $log_pathsudoecho"steam ALL=(ALL:ALL) ALL" >> /etc/sudoers sudoln-s /usr/games/steamcmd /usr/bin/steamcmd steamcmd +quit steam_user_path=/home/steam steamcmd_path=$(which steamcmd)sudo-u$steam_usermkdir-p$steam_user_path/.steam/sdk64/ >> $log_pathsudo-u$steam_user$steamcmd_path+login anonymous +app_update 2394010 validate +quit >> $log_pathsudo-u$steam_usercp$steam_user_path/Steam/steamapps/common/PalServer/linux64/* $steam_user_path/.steam/sdk64/ sudo-u$steam_user nohup $steam_user_path/Steam/steamapps/common/PalServer/PalServer.sh >> $log_path
我们通过alicloud_instance
这一资源上 user_data
字段,将游戏服务的安装脚本进行 base64 编码导入到 ECS 实例中。然后通过 alicloud_ecs_command
和 alicloud_ecs_invocation
这两个资源类型,通过执行 nohup sudo bash /install.sh &
来启动安装脚本。
resource "alicloud_instance""enhance" { availability_zone = data.alicloud_zones.example.zones.0.id instance_name ="terraform-palworld" image_id = data.alicloud_images.example.images.0.id instance_type = data.alicloud_instance_types.enhance.instance_types.0.id security_groups = [alicloud_security_group.example.id] vswitch_id = alicloud_vswitch.example.id # 这里定义了安装脚本,base64反编码即可取到脚本文件 user_data ="IyEvYmluL2Jhc2gKY2F0Pmluc3RhbGwuc2g8PEVPRgojIS9iaW4vYmFzaApzdGVhbV91c2VyPXN0ZWFtCmxvZ19wYXRoPS90bXAvcGFsX3NlcnZlci5sb2cKc3VkbyB1c2VyYWRkIC1tIC1zIC9iaW4vYmFzaCBcJHN0ZWFtX3VzZXIKc3VkbyBhZGQtYXB0LXJlcG9zaXRvcnkgbXVsdGl2ZXJzZSAteSA+IFwkbG9nX3BhdGgKc3VkbyBkcGtnIC0tYWRkLWFyY2hpdGVjdHVyZSBpMzg2ID4+IFwkbG9nX3BhdGgKc3VkbyBhcHQgdXBkYXRlIC15ID4+IFwkbG9nX3BhdGgKc3VkbyBhcHQtZ2V0IHJlbW92ZSBuZWVkcmVzdGFydCAteSA+PiBcJGxvZ19wYXRoCmVjaG8gc3RlYW0gc3RlYW0vbGljZW5zZSBub3RlICcnIHwgc3VkbyBkZWJjb25mLXNldC1zZWxlY3Rpb25zIAplY2hvIHN0ZWFtIHN0ZWFtL3F1ZXN0aW9uIHNlbGVjdCAiSSBBR1JFRSIgfCBzdWRvIGRlYmNvbmYtc2V0LXNlbGVjdGlvbnMgCnN1ZG8gYXB0IGluc3RhbGwgc3RlYW1jbWQgLXkgPj4gXCRsb2dfcGF0aApzdWRvIGVjaG8gInN0ZWFtICAgQUxMPShBTEw6QUxMKSBBTEwiID4+IC9ldGMvc3Vkb2VycwpzdWRvIGxuIC1zIC91c3IvZ2FtZXMvc3RlYW1jbWQgL3Vzci9iaW4vc3RlYW1jbWQKc3RlYW1jbWQgK3F1aXQKc3RlYW1fdXNlcl9wYXRoPS9ob21lL3N0ZWFtCnN0ZWFtY21kX3BhdGg9XCQod2hpY2ggc3RlYW1jbWQpCnN1ZG8gLXUgXCRzdGVhbV91c2VyIG1rZGlyIC1wIFwkc3RlYW1fdXNlcl9wYXRoLy5zdGVhbS9zZGs2NC8gPj4gXCRsb2dfcGF0aApzdWRvIC11IFwkc3RlYW1fdXNlciBcJHN0ZWFtY21kX3BhdGggK2xvZ2luIGFub255bW91cyArYXBwX3VwZGF0ZSAyMzk0MDEwIHZhbGlkYXRlICtxdWl0ID4+IFwkbG9nX3BhdGgKc3VkbyAtdSBcJHN0ZWFtX3VzZXIgY3AgXCRzdGVhbV91c2VyX3BhdGgvU3RlYW0vc3RlYW1hcHBzL2NvbW1vbi9QYWxTZXJ2ZXIvbGludXg2NC8qIFwkc3RlYW1fdXNlcl9wYXRoLy5zdGVhbS9zZGs2NC8Kc3VkbyAtdSBcJHN0ZWFtX3VzZXIgbm9odXAgL2hvbWUvc3RlYW0vU3RlYW0vc3RlYW1hcHBzL2NvbW1vbi9QYWxTZXJ2ZXIvUGFsU2VydmVyLnNoID4+IFwkbG9nX3BhdGgKRU9G"} resource "alicloud_ecs_command""command" { name ="start-palworld"# 这里定义了启动命令,base64反编码为 nohup sudo bash /install.sh & command_content ="bm9odXAgc3VkbyBiYXNoIC9pbnN0YWxsLnNoICY=" description ="For Terraform Palworld" type ="RunShellScript" working_dir ="/root"} resource "alicloud_ecs_invocation""run-command" { command_id = alicloud_ecs_command.command.id instance_id = [alicloud_instance.enhance.id] }
2.3. 镜像复用
通过上述的 Terraform 模板,我们可以快速在阿里云上创建出一台 ECS 实例,并且通过自动化的脚本安装好了幻兽帕鲁的游戏服务端。初次安装时会下载一系列的依赖软件程序,安装较为耗时,并且占用较大带宽资源。因此这里安装完成后,我们建议对进行该 ECS 实例进行镜像打包方便后续复用。这里我们同样可以通过 Terraform 来自动化构建这一个 ECS 镜像,仅需要五行即可创建出刚刚配置好的实镜像:
resource "alicloud_image""default" { instance_id = alicloud_instance.default.id image_name ="terraform-palworld" description ="terraform-palworld"}
之后,在同一账号下的在其它任意环境中即可通过 DataSource 查询的方式指定该镜像,不再需要执行游戏服务端的安装,可以直接复用镜像,真正做到秒级的一键启动。这种复用镜像的方式,游戏运营商可以做到高效、自动化地在分钟级别部署上百台游戏服务器。
# 通过 name 的正则筛选找到打包的镜像data "alicloud_images""example" { name_regex ="^terraform-palworld$"} # 创建新的实例resource "alicloud_instance""enhance" { availability_zone = data.alicloud_zones.example.zones.0.id instance_name ="terraform-palworld"# 引用已打包出的镜像资源 image_id = data.alicloud_images.example.images.0.id instance_type = data.alicloud_instance_types.enhance.instance_types.0.id security_groups = [alicloud_security_group.example.id] vswitch_id = alicloud_vswitch.example.id } resource "alicloud_ecs_command""command" { name ="start-palworld"# nohup /home/steam/Steam/steamapps/common/PalServer/PalServer.sh & command_content ="bm9odXAgL2hvbWUvc3RlYW0vU3RlYW0vc3RlYW1hcHBzL2NvbW1vbi9QYWxTZXJ2ZXIvUGFsU2VydmVyLnNoICY=" description ="For Terraform Palworld" type ="RunShellScript" working_dir ="/root"} resource "alicloud_ecs_invocation""run-command" { command_id = alicloud_ecs_command.command.id instance_id = [alicloud_instance.enhance.id] }
3. 简单小结
本文提供了一个使用 Terraform 在阿里云上部署幻兽帕鲁游戏服务器的解决方案,用户通过该方案可在分钟级别时间内即可完成服务部署。该方案仅作一个抛砖引玉的演示案例,目前基于 Terraform 对云上基础设施的管理方式,已经成为海内外客户的在面对瞬息万变的市场,加速应用迭代、提升用云管理水平的重要工具手段之一。有关于其它真实的客户案例,可以参阅我们的客户案例文档。
4. 额外彩蛋
阿里云提供新用户免费试用服务器和网络资源,也许能免费搭建您的幻兽帕鲁服务器:
ECS免费资源申请:点击前往
网络免费资源申请:点击前往