networking - 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 语句,但这似乎违背了循环的目的。任何帮助是极大的赞赏。
解决方案
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"
推荐阅读
- git - 重组 git 仓库
- c# - 在 powershell 脚本中使用 c# 函数的正确语法是什么?
- r - 如何通过 2+ 个条件自定义因子变量的订单级别?
- sql - 向表格查询添加日期条件
- sql-server - 创建表,列不能为空,其他列不能为空,以及如何解决
- angular - 错误:位置 0 处的 JSON 中的意外标记 u
- c# - WCF自托管:身份验证方案匿名的http请求被禁止
- rest - 使用 Kubernetes 编排的 RESTful 服务
- php - 无法在 Jasmin SMS 网关中发送 unicode 内容
- solr - Nutch 在索引 SOLR 时出现 Shuffle 错误。