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öra det manuellt i webgränssnittet valde jag såklart att använda Merakis API 🙂

I en bredare kontext kan vi tänka oss följande use-case: Ett eller flera större nätverk installeras med DHCP, men ändras sedan till statisk adressering (och behåller samma adress/gateway/dns etc.).

Jag vill hårdkoda så få inställningar som möjligt. Istället vill jag hämta dom inställningar som enheterna redan fått via DHCP, och sedan konfigurera enheterna med samma IP, Nätmask, Gateway, DNS och VLAN.

Samla information

Om vi kikar på API-dokumentationen hittar vi operationen getDeviceManagementInterface

image

Det låter ju bra, men tyvärr så returneras inte så mycket information för en enhet som använder DHCP:

{'wan1': {'usingStaticIp': False, 'vlan': None}}

Vi får leta vidare i dokumentationen och titta på getOrganizationDevicesStatuses istället. Denna operation har vi använt i ett tidigare blogginlägg, för att lista alla enheter i ett nätverk och ta reda på dess status.
Om vi kikar på vad som returneras för t.ex. en AP som använder DHCP, så ser det ut såhär:

{
  "name": "MY-AP-1",
  "serial": "Q2LD-FGN3-VP7S",
  "mac": "0c:8d:db:65:94:d6",
  "publicIp": "76.250.206.183",
  "networkId": "L_676665844012431556",
  "status": "online",
  "lastReportedAt": "2023-04-12T07:38:42.016000Z",
  "productType": "wireless",
  "model": "MR36",
  "tags": [],
  "lanIp": "10.10.0.5",
  "gateway": "10.10.0.1",
  "ipType": "dhcp",
  "primaryDns": "10.0.100.5",
  "secondaryDns": "1.1.1.1",
  "configurationUpdatedAt": "2023-03-15T15:14:01Z"
}

Här kan vi utläsa vilken IP-adress (lanIp), gateway och DNS som används. Samt att ipType är ‘dhcp’.

För att kunna konfigurera en enhet har vi nu nästan all information vi behöver, vi saknar tyvärr information om vilken nätmask som tilldelats via DHCP. Denna information verkar inte gå att hitta via API, och inte heller via webgränssnittet!

Vi kan alltså inte förlita oss på Meraki för att ta reda på vilken nätmask vi ska använda. Vi kanske vet att alla våra management-nät är av en viss storlek, och kan hårdkoda det i våra script. Men en snyggare och mer dynamisk lösning vore att använda en bra IPAM-lösning som t.ex. NetBox och hämta informationen därifrån med API. Då kan vi också registrera alla enheter i NetBox samtidigt som vi ger dom en statisk IP!

Updatera enheter

För att uppdatera enhetsinställningarna används operationen updateDeviceManagementInterface

image

Demo

Ett simpelt script för att visa principen av hur det fungerar.

import meraki
import os 

# Import api key, org id and net id from the environment
api_key = os.environ.get("MERAKI_DASHBOARD_API_KEY")
org_id = os.environ.get("MERAKI_DASHBOARD_ORG_ID")
net_id = os.environ.get("MERAKI_DASHBOARD_NET_ID")

# Initiate dashboard
dashboard = meraki.DashboardAPI(api_key, print_console=False)

# I know that we are using a /24 for all mgmt
subnetMask = '255.255.255.0'

# Get device statuses for specific network.
# filter for wireless, switches, and only online devices.
deviceStatuses = dashboard.organizations.getOrganizationDevicesStatuses(
org_id, networkIds=net_id, productTypes=['wireless','switch'], statuses=['online'], total_pages='all'
)

# Loop trough all devices that was returned.
for device in deviceStatuses:
    # Get current mgmt settings for the device, store as deviceMgmt  
    deviceMgmt = dashboard.devices.getDeviceManagementInterface(device['serial'])
    # Print device IP/mgmt information. For Demo purposes.
    print(f"Current IP settings for device {device['name']}: \
    \n IP-Type: {device['ipType']} \
    \n IP: {device['lanIp']} \
    \n GW: {device['gateway']} \
    \n DNS: {device['primaryDns']} {device['secondaryDns']} \
    \n VLAN: {deviceMgmt['wan1']['vlan']} \n")  
    
    # Check if the device is using DHCP
    if device['ipType'] == 'dhcp':
        # Store new settings in variable wan1Mgmt
        wan1Mgmt = {'usingStaticIp': True, 'staticIp': device['lanIp'], 'staticSubnetMask': subnetMask, 'staticGatewayIp': device['gateway'], 'staticDns': [device['primaryDns'], device['secondaryDns']]}
        if deviceMgmt['wan1']['vlan']:
            # If device has mgmt VLAN configured, set the same vlan for static assignment.
            wan1Mgmt['vlan'] = deviceMgmt['wan1']['vlan']
        
        # Update device managment settings. Sending the device serial and wan1Mgmt as parameters.
        mgmtResponse = dashboard.devices.updateDeviceManagementInterface(device['serial'], wan1=wan1Mgmt)
        print(f"Managment setting for {device['name']} was updated to: \
        \n {mgmtResponse}")
    else:
        print(f"{device['name']} has static IP, ignoring")
 

Resultat

Vi hittade en AP som använde DHCP och ändrade till statisk adressering.

Current IP settings for device MY-AP-1:
 IP-Type: dhcp
 IP: 10.10.0.5
 GW: 10.10.0.1
 DNS: 10.0.100.5 1.1.1.1
 VLAN: 5

Managment setting for MY-AP-1 was updated to:
 {'wan1': {'usingStaticIp': True, 'staticIp': '10.10.0.5', 'staticSubnetMask': '255.255.255.0', 'staticGatewayIp': '10.10.0.1', 'staticDns': ['10.0.100.5', '1.1.1.1'], 'vlan': 5}}

Kör vi scriptet igen så ser vi att IP-Type har ändrats och vi hoppar över den enheten.

Current IP settings for device MY-AP-1:
 IP-Type: static
 IP: 10.10.0.5
 GW: 10.10.0.1
 DNS: 10.0.100.5 1.1.1.1
 VLAN: 5

MY-AP-1 has static IP, ignoring

I det här fallet fanns det bara en enhet i nätverket, men scriptet hade fungerat oavsett antal enheter. Något vi behöver tänka på när vi använder API och arbetar med individuella enheter är att det kan bli väldigt många API-anrop. Varje anrop tar tid och vi kan lätt få en körtid på flera minuter!

Ett sätt att snabba upp våra script är att arbeta asynkront, som du kan läs mer om i detta inlägg.

Merakis Python-library har också stöd för asynkrona operationer, som vi ser här: Meraki AsyncIO.

Sammanfattning

Det är tämligen enkelt att uppdatera management-inställningarna via Merakis API. Utmaningarna består främst av att ta reda på vilka inställningar vi faktiskt ska sätta. Något som en bra IPAM-lösning kan hjälpa oss med!

Vill vi dessutom arbeta med flera nätverk och större antal enheter blir det mer komplext och körtiden byggs snabbt upp om vi hela tiden arbetar med seriella anrop.


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 ↑