Поймать интерфейс в строке, а затем сохранить его в переменной - PullRequest
0 голосов
/ 08 января 2019

По сути, моя цель - поймать интерфейсы cisco (т.е. Gi1 / 0) из строки, которую я использовал для хранения в переменной intf. Я озадачен тем, как я собираюсь построить свое регулярное выражение с set_fact, который будет ловить интерфейс из переменной intf.

Исходя из regex101.com, это регулярное выражение будет соответствовать интерфейсу Gi1 / 0: ^\w+(-\w+)?\d+(([\/:]\d+)+(\.\d+)?)?$

Я попробовал приведенный ниже код, чтобы, например, перехватить интерфейс Gi1 / 0 и сохранить его в переменной store здесь, но только с ошибками.

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

Это мой полный код:

Полный сценарий

Выполнение без регулярного выражения

Ошибка W Regex

1 Ответ

0 голосов
/ 09 января 2019

Ваш полный код подразумевает, что в выводе может быть несколько строк. Предположительно, все они следуют одному и тому же шаблону, и данные, которые вам нужны от каждого, это просто первый столбец - имя интерфейса? Если да, соответствует ли это вашим потребностям:

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

(Примечание: в вашем примере rl00.stdout_lines содержит список со списком выходных строк в качестве единственного элемента. Это выглядит немного странно, и я не уверен, что бывают случаи, когда присутствуют другие элементы. Ответ должен работать для предоставленных вами примеров данных, но может привести к проблемам при возврате других элементов.)

Это:

  • Прокручивает строки, содержащиеся в списке first , содержащемся в вашей зарегистрированной переменной rl00
  • Фильтрация первых непробельных символов в начале строки
  • Добавляет их как элемент в список «интерфейсы»

Это должно оставить вас со списком, содержащим имена интерфейсов. Затем вы можете обращаться с ними так, как вам нравится, поэтому, например, если они вам нужны в одной строке, разделенной пробелами, вы можете:

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