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

Ansible blockinfile模块循环变量输出异常求助

解决Ansible blockinfile生成多VLAN配置块的问题

错误分析

你当前的问题源于三个关键操作失误:

  • 错误使用with_items循环:你的需求是生成单个配置块包含两个VLAN,但循环vlan列表会为每个VLAN生成独立的配置块,完全违背需求方向
  • 多余的split过滤器:vlan变量已经是['vlan://100', 'vlan://101']格式的列表,添加split会将每个字符串拆分为字符数组,导致item.0取到的是字符串第一个字符(比如'v')
  • 配置块变量引用错误:循环时每个item是单个VLAN字符串,用item.0会将字符串当作数组取索引,导致单个字符输出;去掉索引后两个name都引用同一个item,自然出现重复值

修正方案

步骤1:修正vlan变量生成逻辑

移除多余的split过滤器,确保变量是正确的列表格式:

- set_fact:
    vlan: "{{ nic_info | selectattr('network','defined') | map(attribute='network') | list | unique }}"

步骤2:修改blockinfile任务逻辑

去掉with_items循环,直接引用vlan列表的索引值生成单个配置块:

- name: Create file
  blockinfile:
    path: /test/vlans.txt
    block: |
      interfaces:
       - num:
         - name: '{{ vlan[0] }}'
           egr: 10000
         - name: '{{ vlan[1] }}'
           egr: 10001
    marker: "## {mark}  vlans_config"
  delegate_to: localhost

可选:适配动态VLAN数量

如果vlan列表的长度可能变化(不止2个),可以用Jinja2循环动态生成接口项:

- name: Create file
  blockinfile:
    path: /test/vlans.txt
    block: |
      interfaces:
       - num:
{% for vlan_item in vlan %}
         - name: '{{ vlan_item }}'
           egr: {{ 10000 + loop.index0 }}
{% endfor %}
    marker: "## {mark}  vlans_config"
  delegate_to: localhost

这个写法会根据vlan列表的元素数量自动生成对应项,egr值也会从10000开始依次递增。

最终输出效果

执行修正后的Playbook后,会生成符合预期的单个配置块:

## BEGIN  vlans_config
interfaces:
 - num:
   - name: 'vlan://100'
     egr: 10000
   - name: 'vlan://101'
     egr: 10001
## END  vlans_config

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:30:57