image

I mitt förra inlägg visade jag hur du kommer igång med Meraki API och hämtar information om dina enheter. I detta inlägg tänkte jag utveckla det och ge ett mer praktiskt exempel: Identifiera switchportar som har en Meraki AP inkopplad.

Antag att du har ett nätverk bestående av ett antal switchar och accesspunkter, men du vet inte exakt var accesspunkterna är inkopplade. “Men, det kan jag ju enkelt se i portalen” kanske du tänker nu, och det är sant. Men om du vill samla den informationen för flera nätverk och sammanställa den på ett användbart sätt så blir det snabbt väldigt mycket klickande! Då tycker jag att det är bättre att samla informationen på ett automatiserat sätt och få den data du kan behöva för andra operationer framöver.

För att ta reda på var en AP sitter har jag valt att titta på switchars LLDP information och sedan filtrera ut dom portar som har en Meraki AP som granne.

Hämta LLDP information

API-funktionen getDeviceLldpCdp används för att hämta både CDP och LLDP information från en enhet. Exemplet nedan kommer från en switch med 2 grannar; 1st Meraki MX (port 1) och 1st Meraki MR (port 2). Som du ser får vi både CDP och LLDP från APn, men det är bara i LLDP som vi kan identifiera vilken typ av enhet det är.

{
 "ports": {
  "1": {
   "lldp": {
    "sourcePort": "1",
    "systemName": "Meraki MX64 - Min-FW",
    "portId": "0"
   }
  },
  "2": {
   "cdp": {
    "sourcePort": "2",
    "deviceId": "0c8ddb6594d6",
    "address": "192.168.128.2",
    "portId": "Port 0"
   },
   "lldp": {
    "sourcePort": "2",
    "systemName": "Meraki MR33 - Min-AP",
    "portId": "0"
   }
  }
 },
 "sourceMac": "e0:55:3d:d1:ec:77"
}

Bygga vidare

Mitt slutmål är att skapa en lista med nästlade dictonaries, där första nivån är switchnamnet och andra nivån innehåller serienummer och en lista med portar där jag identifierat en AP. Enligt följande exempel:

[
 {
  "switch1": {
   "serial": "xxxx-yyyy-zzzz",
   "apPorts": [
    "1",
    "34",
    "47"
   ]
  }
 },
 {
  "switch2": {
   "serial": "zzzz-xxxx-yyyy",
   "apPorts": [
    "4",
    "15",
    "39"
   ]
  }
 }
]

Jag har valt följande tillvägagångssätt för att uppnå mitt mål:

  • Hämta information för alla switchar i ett givet nätverk.
  • Hämta cdp/lldp information från en switch i taget och identifiera vilka portar som har en AP som granne.
  • Spara den önskade informationen.

Jag uppnår detta på följande sätt:

# Get all switches in the network (Requires org_id & net_id)
switches = dashboard.organizations.getOrganizationDevicesAvailabilities(org_id,networkIds=net_id,productTypes='switch', total_pages='all')

APswitches = [] # Create list to store switches with AP neighbors.
for switch in switches: #Loop through all switches in the network
    apPorts=[] # Create/empty port list
    switchNeighbors = dashboard.devices.getDeviceLldpCdp(switch['serial']) # Get cdp/lldp information.
    if 'ports' in switchNeighbors: # Check that the switch actually has any cdp/lldp neighbors.
        for port, port_info in switchNeighbors['ports'].items(): # Loop through all cdp/lldp ports for current switch.
            if 'lldp' in port_info: # Check if the current port has a LLDP neighbor.
              if 'systemName' in port_info['lldp']: # Check if the neighbor reports systemName.
                if 'Meraki MR' in port_info['lldp']['systemName']: # Check if the systemName contains 'Meraki MR'.
                  #print(f"  {port_info['lldp']['sourcePort']} {port_info['lldp']['systemName']}")
                  apPorts.append(port_info['lldp']['sourcePort']) # Add the curent port to the apPorts list.
        if len(apPorts) > 0:
          apPorts.sort() # Sort the list, just because it's nice.
          # Add current switch information to the list of switches.
          APswitches.append({switch['name']:{'serial': switch['serial'],'apPorts': apPorts}})

För att verifiera informationen printar jag sedan alla element i min lista:

# Loop through the list and print desired information.
for switch in APswitches:
  for key, value in switch.items():
    print(f"Switch: {key}, Serial: {value['serial']}, AP-ports: {value['apPorts']}")

Outputen blir följande:

Switch: Min-SW, Serial: KOYH-XVBQ-Y791, AP-ports: ['2']

Och såhär ser listan ‘APswitches’ ut om vi printar den i JSON:

>>> import json
>>> print(json.dumps(APswitches, indent=1))
[
 {
  "Min-SW": {
   "serial": "KOYH-XVBQ-Y791",
   "apPorts": [
    "2"
   ]
  }
 }
]

Inte så spännande med bara 1 switch och 1 AP… Om jag kör exakt samma kod på ett nätverk med lite fler switchar och accesspunkter blir detta resultatet:

Switch: SE-HQ-SW-01, Serial: JG8N-G9JQ-EE5W, AP-ports: ['36', '37', '38']
Switch: SE-HQ-SW-02, Serial: FU3D-0C25-NFD9, AP-ports: ['35', '36']
Switch: SE-HQ-SW-04, Serial: LJZE-VZX5-7HWX, AP-ports: ['35']
Switch: SE-HQ-SW-05, Serial: 4A7R-2FT6-2VHN, AP-ports: ['35', '36', '37']
Switch: SE-HQ-SW-06, Serial: OMQG-BG1A-9KNP, AP-ports: ['35', '36', '37', '38']
Switch: SE-HQ-SW-07, Serial: J0B6-VIKY-ILV2, AP-ports: ['35']
Switch: SE-HQ-SW-08, Serial: GQH7-Q65O-BNEG, AP-ports: ['35', '36', '37']
Switch: SE-HQ-SW-09, Serial: YHOK-XVBQ-71Y7, AP-ports: ['35', '36', '37']

Vad är nyttan med det här?

Nu har vi på ett strukturerat sätt fått kunskap om i vilka switchportar våra APs sitter, och vilket serienummer switcharna har. Serienummer är en vital detalj när det gäller Meraki API, både för att hämta information men också för att göra förändringar.

Med den information vi har skaffat oss kan vi hyfsat enkelt bygga vidare och manipulera switchportarna på flera sätt.

Som exempel kan vi sätta “Taggar” på portarna, eller kontrollera om portkonfigurationen överensstämmer med en fördefinierad konfiguration. Om dom inte gör det kan vi automatiskt konfigurera portarna. Ett annat exempel kan vara att periodiskt starta om switchportarna, vilket i sin tur startar om accesspunkterna. Bara fantasin (och API:et) sätter gränserna!

Tillägg

I koden ovan arbeterar jag bara med switchar. Detta styrs genom en filtrering i funktionen getOrganizationDevicesAvailabilities.

dashboard.organizations.getOrganizationDevicesAvailabilities(org_id,networkIds=net_id,productTypes='switch', total_pages='all')

För att hämta alla typer av enheter kan vi helt ta bort productTypes='switch' eller om vi vill ha både switchar och brandväggar kan vi utöka filtret till productTypes=['switch', 'appliance'].

Eftersom vi hämtar cdp/lldp information om alla enheter som returneras av funktionen är det klokt att filtrera på enheter där det kan sitta en AP.


Senior Consultant

2025

Acebit expanderar

1 minute read

Acebit expanderar – automationsess från Dalarna öppnar i Stockholm

Back to Top ↑

2024

Acebit i Falu-Kuriren

less than 1 minute read

Även Falu-Kuriren har intresserat sig för Acebit och besökt oss i Falun!

Back to Top ↑

2023

Meraki API & Mgmt interface

4 minute read

Nyligen stötte jag på ett scenario som innebar att ca 200 Meraki-enheter behövde byta inställning från DHCP till statisk IP-adressering. Istället för att gör...

Arbeta med VPC Del3 - Konfiguration

3 minute read

I mina tidigare inlägg om virtuella port-channels kikade vi på vad det är och vilka delar de utgör. Det här avsnittet kommer beröra hur en grundkonfiguration...

Få upp farten med concurrency

3 minute read

Bakgrund Idag tänkt jag skriva några rader om att skriva concurrent kod, eller “samtidighet” om vi prompt ska översätta det till svenska. För att enklare för...

Back to Top ↑

2022

Back to Top ↑

2021

Back to Top ↑