Выполнение regex_findall и split () в одной строке - PullRequest
1 голос
/ 14 июля 2020

Вот результат, который я пытаюсь проанализировать:

hostname#show bgp vrf vrfname summary | i 1.1
BGP Route Distinguisher: 1.1.1.1:0
BGP router identifier 1.1.1.1, local AS number 2222
1.1.1.3      0 64512  349608  316062   896772    0    0     2w4d          1

У меня есть следующее регулярное выражение, которое успешно соответствует только последней строке. Теперь мне нужно разделить эту строку и просмотреть последний индекс. В данном случае это «1», но я хочу потерпеть неудачу, если это значение равно «0».

- name: debug test
  debug:
    msg: "{{show_bgp_sessions.data | regex_findall('\\d+\\.\\d+\\.\\d+\\.\\d+\\s\\s.*')}}"

Я попытался добавить разделение в нескольких разных форматах в конце «msg» строку, чтобы я мог взять последний индекс и сравнить его в операторе failed_when:

msg: "{{show_bgp_sessions.data | regex_findall('\\d+\\.\\d+\\.\\d+\\.\\d+\\s\\s.*') | split(' ')}}"

Но я получаю следующее сообщение об ошибке:

 "template error while templating string: no filter named 'split'. String:

Я также пробовал чтобы использовать несколько различных форм "end_with" для проверки последнего индекса в строке, поскольку я много использовал это в моем опыте python, но я не могу заставить его работать в ansible. Я не могу создать новую задачу для анализа данных и выполнения разделения по отдельности, потому что мне нужно выполнить эту проверку через al oop.

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Когда вы выбираете строку, переверните строку и разделите первый элемент. Например,

msg: "{{ (my_line|reverse).split()|first }}"
0 голосов
/ 14 июля 2020

Возможно, регулярное выражение, предоставляемое @ Thefourthbird , является лучшим решением.

Но для вашей проблемы это вызвано тем фактом, что действительно нет фильтра split в Jinja, смотри там список: https://jinja.palletsprojects.com/en/2.11.x/templates/#list -of-builtin-filters .

Причина отсутствия такого фильтра проста: split() является функцией Python String, и поскольку Jinja - это Python, вы можете просто использовать его как есть.

Также имейте в виду, что, поскольку regex_findall предназначен для нескольких совпадений, вы Вам нужно будет выбрать первый элемент списка, например, с помощью фильтра first.

Таким образом, ваше сообщение будет таким:

msg: "{{ (show_bgp_sessions.data | regex_findall('\\d+\\.\\d+\\.\\d+\\.\\d+\\s\\s.*') | first).split() }}

Учитывая playbook:

- hosts: all
  gather_facts: no
  vars:
    show_bgp_sessions:
      data: |
        hostname#show bgp vrf vrfname summary | i 1.1
        BGP Route Distinguisher: 1.1.1.1:0
        BGP router identifier 1.1.1.1, local AS number 2222
        1.1.1.3      0 64512  349608  316062   896772    0    0     2w4d          1
        
  tasks:
    - debug:
        msg: "{{ (show_bgp_sessions.data | regex_findall('\\d+\\.\\d+\\.\\d+\\.\\d+\\s\\s.*') | first).split() }}"

Дает резюме:

PLAY [all] *********************************************************************************************

TASK [debug] *******************************************************************************************
ok: [localhost] => {
    "msg": [
        "1.1.1.3",
        "0",
        "64512",
        "349608",
        "316062",
        "896772",
        "0",
        "0",
        "2w4d",
        "1"
    ]
}

PLAY RECAP *********************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...