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

时间:2019-01-08 20:51:50

标签: regex ansible cisco

基本上,我的目标是从我以前存储在变量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

1 个答案:

答案 0 :(得分:0)

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

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

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

此:

  • 循环浏览rl00注册变量包含的 first 列表中的行
  • 从字符串开头过滤第一个非空格字符
  • 将它们添加为“接口”列表中的一项

这应该为您提供一个包含接口名称的列表。然后,您可以按照自己的喜好对待它们,因此,例如,如果需要它们在一条空格分隔的行上,则可以:

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