Ansible 的 template 模块结合 Jinja2 可按需渲染适配不同角色和拓扑的网络配置文件;模板须置于 playbook 同级 templates/ 目录且以 .j2 结尾;通过 facts、inventory 分组和变量动态生成差异化内容,配合循环判空、validate 校验与 backup 备份保障安全。

用 Ansible 的 template 模块配合 Jinja2,可以为不同角色、不同网络拓扑的集群节点生成各自适配的网络配置文件,比如 /etc/network/interfaces、/etc/sysconfig/network-scripts/ifcfg-eth0 或现代的 netplan YAML 文件。关键不在“写死”,而在“按需渲染”——基于主机事实(facts)、清单分组(inventory groups)、自定义变量和条件逻辑实时生成。
模板位置与命名必须规范
Ansible 只在当前 playbook 所在目录的 templates/ 子目录下查找模板文件,且文件名必须以 .j2 结尾。
- 正确路径示例:
playbook.yml同级建templates/netplan.j2 - 错误写法:
templates/netplan.yaml(后缀不对)、conf/netplan.j2(不在 templates 目录)、src: templates/netplan.j2(src参数只写文件名,不带路径)
用变量 + facts 构建差异化内容
网络配置的核心差异点:IP 地址、网关、DNS、是否启用 DHCP、bond/bridge/vlan 拓扑等。这些都可从 Ansible 自动采集的事实或 inventory 中提取:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
-
{{ ansible_all_ipv4_addresses | first }}—— 取第一个 IPv4 地址(适合单网卡场景) -
{{ hostvars[inventory_hostname]['network_config'] | default({}) }}—— 从 host_vars 或 group_vars 中读取结构化网络配置 -
{% if 'lb' in group_names %}mode: active-backup{% endif %}—— 根据主机组动态启用 bond 模式
循环与判空保障模板健壮性
生成多网卡、多 VLAN 或多路由条目时,必须防止因变量未定义或为空导致渲染失败:
- 不要直接写:
{% for vlan in hostvars[inventory_hostname].vlans %} - 应加上防护:
{% if hostvars[inventory_hostname].vlans is defined and hostvars[inventory_hostname].vlans %}{% for vlan in hostvars[inventory_hostname].vlans %}...{% endfor %}{% endif %} - 对 IP 列表也做兜底:
addresses: [{{ (vlan.ip | default('192.168.1.100/24')) }}]
上线前强制校验 + 备份防翻车
网络配置出错可能导致节点失联,必须加两道保险:
- 用
validate调用系统工具预检语法:validate: '/usr/sbin/netplan generate --debug --root /tmp/test-netplan 2>&1 | grep -q "No issues found"' - 开启
backup: yes,出问题时能秒级还原旧版:dest: /etc/netplan/01-network-config.yaml会自动备份为/etc/netplan/01-network-config.yaml.2026-05-20@23:36:12~

















