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
相关产品推荐
相关产品推荐

