Как повторить задание до тех пор, пока не будет получен результат + показать метки времени каждой повторной попытки? - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь решить проблему автоматизации сети.Проблема в том, что у нас странное поведение сетевых устройств (телефонов SNOM), подключенных в цепочке к определенному порту коммутатора Cisco.Дело в том, что один из таких телефонов (каждый раз другой) исчезает случайным образом, и после этого такое устройство не может получить IP-адрес через DHCP.Мы все еще не нашли способ воспроизвести проблему, поэтому я включил журналы отладки на DHCP-сервере и теперь ожидаю, когда один из mac-адресов исчезнет из таблицы mac-адресов интерфейса коммутатора.

И как ciscoне поддерживаю команду linux 'watch', я написал для этой цели простую сборную playbook:

---
- name: show mac address-table 
  hosts: ios
  gather_facts: no


  tasks:

  - name: show mac address-table interface Fa0/31
    ios_command:
      commands: show mac address-table interface Fa0/31
      wait_for:
        - result[0] contains 0004.1341.799e
        - result[0] contains 0004.134a.f67d
        - result[0] contains 0004.138e.1a53
    register: result
    until: result is failed
    retries: 1000
  - debug: var=result

Но в этой конфигурации я вижу только

FAILED - RETRYING: show mac address-table interface Fa0/31 (660 retries left).
FAILED - RETRYING: show mac address-table interface Fa0/31 (659 retries left).
FAILED - RETRYING: show mac address-table interface Fa0/31 (658 retries left).
FAILED - RETRYING: show mac address-table interface Fa0/31 (657 retries left).

на выходе,Я пытался использовать плагин обратного вызова Anstomlog, но он показывает временные метки только для успешных условий (т. Е. В моем случае - тогда результат не удалось)

Итак, я ищу совет, как достичь обоихЦели:

  • запускать задание до тех пор, пока не будет получен статус
  • записывать временные метки каждой повторной попытки

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

хорошо, так как первоначальный вопрос был об Ansible, я решил эту проблему, просто сохранив временную метку и получив журнал dhcp от маршрутизатора и отфильтровав журнал по временной метке и MAC-адресам:

---
- name: Find switch port by host ip address
  hosts: all
  gather_facts: no
  connection: local
  roles:
    - Juniper.junos  
  vars:
    systime: "{{ ansible_date_time.time }}"
    timestamp: "{{ ansible_date_time.date }}_{{ systime }}"
    connection_settings:
      host: "{{ ansible_host }}"
      timeout: 120
    snom_mac_addresses:
      - '00_04:13_41:79_9e'
      - '00_04:13_4a:f6_7d'
      - '00_04:13_8e:1a_53'

  tasks:

  - name: show mac address-table interface Fa0/31
    ios_command:
      commands: show mac address-table interface Fa0/31
      wait_for:
        - result[0] contains {{ snom_mac_addresses[0] | replace(':', '.')| replace('_', '') }}
        - result[0] contains {{ snom_mac_addresses[1] | replace(':', '.')| replace('_', '') }}
        - result[0] contains {{ snom_mac_addresses[2] | replace(':', '.')| replace('_', '') }}
        - result[0] contains {{ snom_mac_addresses[3] | replace(':', '.')| replace('_', '') }}
    register: result
    until: result is failed
    retries: 1000
    ignore_errors: True
    when: inventory_hostname == 'access-switch'


  - name: save timestamp in Junos format
    set_fact: 
      junos_timestamp: "{{ lookup('pipe','date +%b_%_d_%H:%M') | replace('_', ' ') }}"
    run_once: yes
    delegate_to: localhost

  - debug: 
      var: junos_timestamp
    run_once: yes
    delegate_to: localhost

  - name: get dhcp log from router
    junos_scp:
      provider: "{{ connection_settings }}"
      src: /var/log/dhcp-service.log
      remote_src: true
    when: inventory_hostname == 'router'

  - name: filter log for time
    run_once: yes
    shell: "egrep -i '{{ junos_timestamp }}' dhcp-service.log"
    register: grep_time_output
    delegate_to: localhost

  - debug: var=grep_time_output.stdout_lines    

  - name: filter log for time and mac
    run_once: yes
    shell: "egrep -i '{{ snom_mac_addresses | join('|') | replace(':', ' ')| replace('_', ' ') }}' dhcp-service.log"
    register: grep_mac_output
    delegate_to: localhost

  - debug: var=grep_mac_output.stdout_lines

Я уверен, что это не выглядиткак элегантное решение, но по крайней мере я все работал в одной среде Ansible, и любой мог повторно использовать часть моего кода без значительного рефакторинга.

только одно сомнение - мне нужно использовать свой собственный формат дляMac-адреса, потому что протокол отладки Cisco и Juniper печатает их по-разному:

Журнал отладки Juniper:

Mar  6 13:14:19.582886 [MSTR][DEBUG] client_key_compose: Composing key (0x1c6aa00) for cid_l 7, cid d4 a3 3d a1 e2 38, mac d4 a3 3d a1 e2 38, htype 1, subnet 10.111.111.1, ifindx 0, opt82_l 0, opt82 NULL

Cisco:

 30    0004.133d.39fb    DYNAMIC     Po1

Но, возможно, естьэто умный способ обработки всех различных форматов для MAC-адресов в Ansible.

0 голосов
/ 01 марта 2019

Лучше переписать его как обычный цикл (с помощью include_tasks) и сообщить всю информацию, необходимую для выполнения этой задачи.

Полагаться на «повторную попытку» в качестве сторожевого таймера не очень хорошая идея.

Более того, я думаю, что лучше переписать его как самостоятельную программу.Если вы беспокоитесь о том, чтобы ssh переключался, netmiko - это отличная коллекция готовых к использованию причуд для всех сетевых устройств.У него есть метод .command для выполнения на коммутаторах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...