首页 > 解决方案 > Ansible - 在循环上使用“when”条件语句来排除匹配的接口

问题描述

我目前有一个功能手册,可以连接到网络设备,返回 LLDP 输出,对其进行格式化,然后将其写回设备的接口。我们遇到了一个问题,我们需要排除特定接口(在 host_vars 中指定)以免被覆盖。我遇到的问题是在剧本中的这一点:

- name: CONFIGURE PORT DESCRIPTIONS USING NEIGHBOR DATA
    include_tasks: lldp_int_desc.yml
    with_items: "{{ neighbors.response }}"
    when: "{{ item.local_interface }} not in {{ excluded_ports }}"

我最初尝试使用“block”和“when”语句,但是我很快了解到它们不适用于循环,因此解决方法是使用 include_tasks。条件“when”语句从返回的 LLDP 输出中获取本地接口,并根据 host_vars 目录中的接口列表检查该接口:

---
excluded_ports:
 - Eth1/10
 - Eth1/11

错误是:

“条件检查'{{ item.local_interface }}不在{{excluded_ports}}'中失败。错误是:模板错误时模板字符串:预期令牌',',得到'字符串'。字符串:{% if Eth1/ 5 不在 [u'Eth1/10', u'Eth1/11'] %} 真 {% else %} 假 {% endif %}

因此,第一个变量是字符串而第二个变量是列表似乎是一个问题?我不确定如何显示excluded_ports 信息。我考虑过为每个接口创建特定的 when 语句,但这似乎违背了循环的目的。任何帮助是极大的赞赏。

标签: networkingansible

解决方案


when子句本身是一个原始的 jinja2 表达式,所以你不应该使用{{}},所以基本上只需将子句更改为,

- name: CONFIGURE PORT DESCRIPTIONS USING NEIGHBOR DATA
  include_tasks: lldp_int_desc.yml
  with_items: "{{ neighbors.response }}"
  when: "item.local_interface not in excluded_ports"

推荐阅读