unreal-engine4 - 如何使用打包程序动态更改模板?
问题描述
所以我一直在为 Packer 和 HCL 争取一段美好的时光,我正在努力解决一些看似微不足道的问题。我正在使用 Packer 构建一个 Unreal Engine 游戏服务器映像,以支持拥有多个 UE 服务器实例,我利用 supervisord 来完成这项工作。到目前为止一切都很好,直到我们不得不集成 Steam,这就是我的问题开始的地方。
在蒸汽之前,我有这个代码:
[program:mygame]
command=/opt/game_server/Game.sh
process_name=%(program_name)s_%(process_num)s
numprocs=number_of_processes
stopasgroup=true
user=ubuntu
stdout_logfile=/opt/game_server/logs/supervisor/ueserver/%(program_name)s_%(process_num)s_stdout.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stderr_logfile=/opt/game_server/logs/supervisor/ueserver/%(program_name)s_%(process_num)s_stderr.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
所以我所做的只是number_of_processes
根据我的服务器需要的大小对字符串进行内联修改。
Steam 的问题在于它需要一个带有查询端口的参数,如下所示:
command=/opt/game_server/Game.sh -queryport=27015
如果您不设置,则每个盒子只能运行一个实例,效率不高,我正在尝试找到一种方法来动态设置该端口,这样我就可以获得设置所需服务器数量的好处并避免这样的事情:
[program:dominionserver-1]
command=/opt/game_server/DominionServer.sh -queryport=27015
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
[program:dominionserver-2]
command=/opt/game_server/DominionServer.sh -queryport=27016
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
[...]
我想我可以使用 Packer 的这个功能:https ://www.packer.io/docs/templates/hcl_templates/functions/file/templatefile但我不知道如何修改文件的特定位。
解决方案
我最终利用 Ansible 来实现我想要的,所以在 Packer 中我有这个:
provisioner "ansible" {
playbook_file = "./ansible/playbook.yaml"
extra_arguments = [
"--extra-vars", "server_count=${var.number_of_processes}"
]
}
剧本在哪里:
---
- name: Deploy dynamic supervisor
hosts: 'all'
vars:
query_port: 27014
become: yes
become_method: sudo
tasks:
- name: copy supervisor
template:
src: templates/gameserver.j2
dest: "/home/ubuntu/gameserver{{ item }}.conf"
with_sequence: start=1 end={{ server_count }}
和相关的j2模板:
[program:gameserver-{{ item }}]
command=/opt/game_server/GameServer.sh -queryport={{ query_port|int + item|int }}
stopasgroup=true
user=ubuntu
推荐阅读
- jenkins - Jenkins:获取更深层次的下游作业的构建信息
- javascript - 拆分和展平逗号分隔的字符串数组
- echo - "$IFS" 和 $(echo "$IFS) 有什么区别?
- java - Sql Developer 在 Mac OS Monterey 上几乎立即崩溃
- javascript - 在 NodeJS 中使用地图
- laravel - Laravel Sai 指向 docker 教程
- javascript - 有条件地使用导入而不使用 import()
- powerbi - 将行更改为列标题 - PowerBI
- javascript - 如何在 React 中映射包含其他对象和数组的整个数组?
- python - Python ValueError 要解包的值很多