Meraki Org Manager is a standalone Python project for:
- creating or updating a Cisco Meraki organization,
- creating or updating a network,
- claiming and onboarding devices by serial number,
- assigning device names by SKU,
- storing deployment parameters in a single configuration file,
- managing the workflow through both CLI and a simple web UI.
The repository is structured to be readable, extensible, and safe to publish on GitHub without secrets.
- Idempotent deployment flow that checks whether the organization, network, and devices already exist.
- Safe update behavior using
updateOrganization,updateNetwork, andupdateDevicefor existing resources. - Single local configuration file stored in
config/organizations.yaml, with a tracked example in config/organizations.yaml.example. - Credentials isolated in
.env. - Web form for creating a new configuration or loading and editing an existing one by organization name.
- Deployment logging written locally to
logs/deployments.log, with a tracked sample log in logs/deployments.log.example. - Simple architecture with clear separation between
repository,gateway,service, andweb. - The project is intentionally extensible and can evolve beyond camera onboarding into broader organization setup and other Meraki device types.
config/organizations.yaml # local deployment parameters, gitignored
config/organizations.yaml.example
.env # API key and local runtime settings
src/meraki_org_manager/
cli.py # CLI entry point
web.py # FastAPI application and form handling
settings.py # .env loading and settings normalization
repository.py # YAML config read/write
gateway.py # thin wrapper over the official Meraki SDK
services/deployment.py # idempotent deployment workflow
models.py # config validation and serialization
logging_utils.py # file logging
tests/ # unit tests
- Python 3.11+
uv- Cisco Meraki Dashboard API key with permissions to manage organizations, networks, and devices
mkdir -p ~/Projects
cd ~/Projects
git clone <your-repository-url> MerakiNewOrgDev
cd MerakiNewOrgDev
uv venv .venv
source .venv/bin/activate
uv pip install -e .
cp .env.example .env
cp config/organizations.yaml.example config/organizations.yamlFill in .env before the first real deployment:
MERAKI_DASHBOARD_API_KEY=...
MERAKI_CALLER=MerakiOrgManager/0.1.0 MerakiNewOrgDev
MERAKI_API_BASE_URL=https://api.meraki.com/api/v1MERAKI_CALLER must follow the Meraki format ApplicationName/Version VendorName, without spaces or special characters inside each token.
After that, update config/organizations.yaml with your target organization, network, and device data.
All local deployment parameters are stored in config/organizations.yaml.
The repository only tracks the sample file config/organizations.yaml.example. Copy it before your first real use:
cp config/organizations.yaml.example config/organizations.yamlEach deployment entry contains:
organization: name and optional persistedidnetwork: name, timezone, product types, tags, and notesdevices: list of devices withsku,serial,name,tags, andnotesoptions: deployment behavior such as whether reassignment from another network is allowed
After a successful deployment, the configuration is updated with organization.id, network.id, and last_deployed_at.
If config/organizations.yaml does not exist yet, the app can still read the tracked example file as a starting point.
Deploy one saved organization configuration from the CLI:
meraki-org-manager deploy --org-name "Example Meraki Organization"Start the web UI:
meraki-org-manager serveThen open:
http://127.0.0.1:8000
The web form supports:
- creating a new configuration,
- loading an existing configuration by organization name,
- editing network and device parameters,
- saving updates back to the YAML file,
- immediately triggering a deployment to Meraki.
.envis ignored by Git.- runtime logs are ignored by Git.
config/organizations.yamlis ignored by Git.- only
.env.exampleis committed. - only sample configuration and sample log files are committed.
- the sample configuration file contains placeholder data only.
Before pushing publicly, verify that you are not committing:
- real API keys,
- production serial numbers,
- local configuration values from
config/organizations.yaml, - local log files.
python -m unittest discover -s testsThe project follows common Meraki API workflows:
createOrganization/updateOrganizationcreateOrganizationNetwork/updateNetworkgetOrganizationInventoryDeviceclaimIntoOrganizationInventoryclaimNetworkDevicesremoveNetworkDevicesupdateDevice
If a device already belongs to another network, deployment stops with a conflict unless allow_reassign_devices is explicitly enabled.