如何使用Packer动态修改模板生成Steam游戏服务器多实例的supervisord配置
可行实现方案
通过Packer的templatefile结合HCL循环逻辑即可实现动态生成多实例带不同query端口的supervisor配置,不需要手动编写每个实例的配置段,步骤如下:
1. 编写Supervisor配置模板
先创建模板文件supervisor_ue.tpl,内容如下:
%{ for instance_idx in range(instance_count) ~} [program:dominionserver-${instance_idx + 1}] command=/opt/game_server/DominionServer.sh -queryport=${query_port_start + instance_idx} stopasgroup=true user=ubuntu stdout_logfile=/opt/game_server/logs/supervisor/ueserver/%(program_name)s_stdout.log stdout_logfile_maxbytes=1MB stdout_logfile_backups=10 stderr_logfile=/opt/game_server/logs/supervisor/ueserver/%(program_name)s_stderr.log stderr_logfile_maxbytes=1MB stderr_logfile_backups=10 %{ endfor ~}
模板内置2个可传入的变量:
instance_count:需要启动的UE服务实例总数query_port_start:query端口的起始值,后续实例端口自动依次+1
2. 在Packer HCL中渲染模板并写入镜像
在你的Packer构建配置中,先定义相关变量,再通过templatefile函数渲染模板,将生成的配置写入到镜像的supervisor配置目录下,示例配置如下:
# 定义可配置变量,构建时可动态传入 variable "ue_instance_count" { type = number default = 4 # 默认4个实例,可根据服务器规格调整 } variable "ue_query_port_start" { type = number default = 27015 # 默认起始端口 } source "..." { # 你的原有source配置保持不变 } build { sources = ["..."] # 原有其他provisioner保持不变 # 新增:渲染supervisor配置并写入镜像 provisioner "file" { content = templatefile("${path.root}/supervisor_ue.tpl", { instance_count = var.ue_instance_count query_port_start = var.ue_query_port_start }) destination = "/etc/supervisor/conf.d/ueserver.conf" } }
3. 配置说明
- 原有基于
numprocs的配置方式无法为每个进程传递独立的端口参数,因此改为循环生成独立program配置段的方案,完全符合supervisor的配置规范 - 需要调整实例数时,只需修改
ue_instance_count变量的值即可,无需改动模板或其他配置 - 构建镜像时可通过
-var "ue_instance_count=8"的方式动态传入实例数,适配不同配置的服务器
内容的提问来源于stack exchange,提问作者nikolaigauss
相关产品推荐
相关产品推荐

