求助:Jinja2实现应用机器列表分组与URL批量关联
Jinja2集群机器与URL配对解决方案
问题背景
已通过Python向Jinja2传入两个列表:
app_machine_list:包含14台应用机器,已划分为3个集群(4、4、6台)machine_url_list:包含6个URL,需为每个集群分配2个URL
现有模板已实现集群划分,但未关联URL,期望输出为每台机器对应分配的URL,格式如下:
CLUSTER1 abcapp01 - scheme://host1.app.local abcapp02 - scheme://host1.app.local abcapp03 - scheme://host2.app.local abcapp04 - scheme://host2.app.local CLUSTER2 abcapp05 - scheme://host3.app.local abcapp06 - scheme://host3.app.local abcapp07 - scheme://host4.app.local abcapp08 - scheme://host4.app.local CLUSTER3 abcapp09 - scheme://host5.app.local abcapp10 - scheme://host5.app.local abcapp11 - scheme://host5.app.local abcapp12 - scheme://host6.app.local abcapp13 - scheme://host6.app.local abcapp14 - scheme://host6.app.local
修改后的Jinja2模板
{% set cluster_urls = machine_url_list | batch(2) %} {% for machine_batch, urls in zip(app_machine_list | batch((app_machine_list | length) // 3), cluster_urls) -%} CLUSTER{{ loop.index }} {% set half = (machine_batch | length + 1) // 2 %} {% set url1 = urls[0] %} {% set url2 = urls[1] %} {%- for machine in machine_batch[:half] %} {{ machine }} - {{ url1 }} {%- endfor %} {%- for machine in machine_batch[half:] %} {{ machine }} - {{ url2 }} {%- endfor %} {%- endfor %}
逻辑说明
- URL分组:用
batch(2)将machine_url_list拆分为3组,每组2个URL,对应3个集群; - 同步遍历:通过
zip同时迭代机器集群批次和对应的URL组; - 分配规则:计算
half值,确保每个集群的机器按数量平分(若为奇数则多1台分配给第一个URL); - 关联输出:先输出前
half台机器与第一个URL的配对,再输出剩余机器与第二个URL的配对。
内容的提问来源于stack exchange,提问作者Mark Kaye
相关产品推荐
相关产品推荐

