在字符串中捕获接口,然后将其存储在变量中

Catch the Interface in the String then Store it in a Variable

基本上我的目标是从我用来存储在变量 intf 中的字符串中捕获 cisco 接口(即 Gi1/0)。我很困惑如何使用 set_fact 构造我的正则表达式,它将从 intf 变量中捕获接口。

基于 regex101.com 这个正则表达式将匹配 Gi1/0 接口: ^\w+(-\w+)?\d+(([\/:]\d+)+(\.\d+)?)?$

我尝试使用下面的代码来捕获接口 Gi1/0,并将其存储在变量 storehere 中,但只遇到了错误。

  - name: Catch interface only ie. Gi1/0 and store in storehere variable
    set_fact:
      storehere: "{{ intf | regex_findall(^\w+(-\w+)?\d+(([\/:]\d+)+(\.\d+)?)?$) }}"

这是我的完整代码:

Full Script

Execution W/o Regex

Error W Regex

您的完整代码似乎暗示输出中可能有多行。大概它们都遵循相同的模式,并且您需要从每个数据中获取的数据只是第一列 - 接口名称?如果是这样,这是否满足您的需求:

- set_fact:
    interfaces: "{{ interfaces | default([]) }} + {{ [ item | regex_search('^([^ ])+') ] }}"
  loop: "{{ rl00.stdout_lines | first }}"
- debug:
    var: interfaces

(注意:在您的示例中,rl00.stdout_lines 包含一个列表,其中输出行列表作为其唯一元素。这看起来有点奇怪,我不确定是否存在其他元素会出现的情况存在。此答案应该适用于您提供的示例数据,但如果返回其他元素,可能 运行 会出现问题。)

这个:

  • 循环遍历 rl00 注册变量
  • 中包含的 first 列表中的行
  • 从字符串开头过滤第一个非space字符
  • 将它们添加为 'interfaces' 列表中的项目

这应该会给您留下一个包含接口名称的列表。然后您可以按照自己喜欢的方式对待它们,例如,如果您需要将它们放在单独的 space 分隔行上,那么您可以:

- debug:
    var: interfaces | join(' ')