如何使用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
相关产品推荐
相关产品推荐

