You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Ansible/Jinja2为嵌套主机列表的每个主机追加端口号

Ansible/Jinja2 嵌套主机列表拼接端口实现方案

基础变量定义:原始嵌套主机列表变量命名为nested_hosts,待拼接端口命名为target_port,示例值为8000。

方案1:一行式过滤器实现(适合Playbook内直接计算)

直接通过两层map过滤器组合实现,代码简洁:

- name: 生成带端口的嵌套主机列表
  hosts: localhost
  gather_facts: false
  vars:
    nested_hosts: [['host-0', 'host-1'], ['host-2', 'host-3'], ['host-4', 'host-5', 'host-6']]
    target_port: 8000
  tasks:
    - name: 拼接端口
      ansible.builtin.set_fact:
        nested_hosts_with_port: "{{ nested_hosts | map('map', 'format', '{}:' ~ target_port) | list }}"
    
    - name: 验证输出结果
      ansible.builtin.debug:
        var: nested_hosts_with_port

逻辑说明:外层map遍历嵌套列表中的每一个子主机组,内层map遍历子组内的每个主机名,通过format拼接端口后缀,最后用list强制转换为列表格式。

方案2:Jinja2模板嵌套循环实现(适合复杂逻辑场景)

如果需要在模板中生成或者要附加额外判断逻辑,用显式嵌套循环可读性更高:

{% set final_list = [] %}
{% for host_group in nested_hosts %}
  {% set temp_group = [] %}
  {% for host in host_group %}
    {# 可在此处添加自定义判断逻辑,比如跳过特定主机 #}
    {% do temp_group.append(host ~ ':' ~ target_port) %}
  {% endfor %}
  {% do final_list.append(temp_group) %}
{% endfor %}

{# 输出最终结果 #}
{{ final_list }}

两种方案输出结果完全一致,均为目标嵌套结构:

[
  ["host-0:8000", "host-1:8000"],
  ["host-2:8000", "host-3:8000"],
  ["host-4:8000", "host-5:8000", "host-6:8000"]
]

内容的提问来源于stack exchange,提问作者jack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:24:04