首页 > 解决方案 > 如何使用打包程序动态更改模板?

问题描述

所以我一直在为 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但我不知道如何修改文件的特定位。

标签: unreal-engine4steampacker

解决方案


我最终利用 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

推荐阅读