【发布时间】:2020-03-24 11:51:21
【问题描述】:
我正在寻找 Cisco 路由器上具有特定状态的所有端口以将其关闭。我希望通过 std.out 并使用正则表达式来做到这一点,但对正则表达式语法一无所知。
例如,show 命令的输出将类似于以下输出。
Port Device State Call DN Dev State
---------- --------------- -------- ------------- ------- ----------- ----
0/1/0 DEV0001 IS IDLE 2344 ATT
0/1/1 DEV0002 IS IDLE 2567 ATT
0/1/2 DEV0002 IS IDLE 2567 DEL
我想做的是将具有 Dev State = ATT 的端口号存储在一个变量中,以便我可以关闭它们。在 Cisco 中,我可以将 show 命令过滤为 - show port |包括 ATT - 这将仅列出包含 Dev State ATT 的端口,但不会在输出中显示任何列标题。从这个输出中,我需要循环并存储端口号。希望这是有道理的。
感谢任何帮助。谢谢。
Ansible 脚本:
tasks:
- name: show port
ios_command:
commands:
- show port summary | incl ATT
register: config
- set_fact
myvalue: ""{{ config.stdout | regex_search(??) }}""
when config.stdout | length > 0
调试配置输出:
"stdout_lines": [
[
"Total Devices: 4",
"Total Calls in Progress: 0",
"Total Call Legs in Use: 0",
"",
"Port Device Device Call Dev Directory Dev ",
"Identifier Name State State Type Number Cntl ",
"---------- --------------- -------- ------------- ------- ----------- ---- ",
"0/1/0 DEV0001 IS IDLE ALG 3880 DEL",
"0/1/1 DEV0002 IS IDLE ALG 3881 ATT",
"0/1/2 DEV0003 IS IDLE ALG ATT",
"0/1/3 DEV0004 IS IDLE ALG 3882 DEL"
]
]
} ]
【问题讨论】:
-
使用 -debug: var=config 的输出更新您的问题
-
我已经添加了 stdout_lines 输出
-
stdout_lines是一个列表列表。显然,您需要第一项stdout_lines.0。 -
ok 我在修改行 cols 后仍然收到与以前类似的错误:“{{ config.stdout_lines.0.split() }}”“任务包含一个带有未定义变量的选项。错误是:'list object' 没有属性 'split'\n\n错误似乎出现在
-
config.stdout_lines.0是一个列表。split()一个列表是不可能的。我的答案适用于第一个输出示例。它不适用于您发布的stdout_lines。我不会修复它。无法使用列的名称,因为“设备”正在重复。由于缺少一个“目录”项,因此无法拆分包含数据的行。我希望思科能够为您提供一种可以解析的格式。