хорошо, так как первоначальный вопрос был об 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.