Ansible Регулярное выражение - PullRequest
1 голос
/ 24 марта 2020

Я ищу все порты с определенным статусом на маршрутизаторе 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 | include ATT - в нем будут перечислены только порты, содержащие ATT состояния Dev, но не будет отображаться заголовок столбца в выходных данных. Из этого вывода мне нужно выполнить l oop и сохранить номера портов. Надеюсь, что это имеет смысл.

Ценю любую помощь. Спасибо.

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"
        ]
    ]
} ]

1 Ответ

2 голосов
/ 24 марта 2020
  • Там должно быть config.stdout_lines вместе с config.stdout
  • Нет необходимости проверять список. L oop будет пропущено, если список пуст.
  • Строки с данными выбираются по шаблону '^\d/\d/\d\s*(.*)$'
  • Можно настроить результат с помощью изменив условие when и изменив список myitems добавил список myvalues

Задачи ниже

    - set_fact:
        myvalues: "{{ myvalues|default([]) + [myitems.4] }}"
      loop: "{{ config.stdout_lines|select('regex', myregex)|list }}"
      vars:
        myregex: '^\d/\d/\d\s*(.*)$'
        myitems: "{{ item.split() }}"
      when: myitems.5 == "ATT"
    - debug:
        var: myvalues

give

    "myvalues": [
        "2344", 
        "2567"
    ]


Как правило, можно создать список с именами столбцов и создать словарей с выбранными данными. Например,
    - set_fact:
        cols: "{{ config.stdout_lines.0.split() }}"
    - set_fact:
        myvalues: "{{ myvalues|default([]) +
                      [dict(cols|zip(myitems))] }}"
      loop: "{{ config.stdout_lines|select('regex', myregex)|list }}"
      vars:
        myregex: '^\d/\d/\d\s*(.*)$'
        myitems: "{{ item.split() }}"
      when: myitems.5 == "ATT"
    - debug:
        var: myvalues

дает

    "myvalues": [
        {
            "Call": "IDLE", 
            "DN": "2344", 
            "Dev": "ATT", 
            "Device": "DEV0001", 
            "Port": "0/1/0", 
            "State": "IS"
        }, 
        {
            "Call": "IDLE", 
            "DN": "2567", 
            "Dev": "ATT", 
            "Device": "DEV0002", 
            "Port": "0/1/1", 
            "State": "IS"
        }
    ]

Тогда можно выбрать любую комбинацию данных. Например

    - set_fact:
        myports: "{{ myvalues|json_query('[].Port') }}"
    - debug:
        var: myports

дать список портов

    "myports": [
        "0/1/0", 
        "0/1/1"
    ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...