š„ļø 3.3 Cisco Compute Management Platforms
Overview
Cisco provides powerful compute management solutions for data centers, offering centralized management, automation, and programmability for server infrastructure.
1. Cisco UCS Manager (UCSM)
UCS Manager Unified Computing System
UCS Manager is an embedded management software that provides unified, integrated management of all Cisco UCS components including servers, fabric interconnects, and I/O modules.
Key Capabilities
- Service Profiles: Abstract server identity from hardware
- Server Pools: Logical grouping of servers for workload placement
- Policy-Based Management: Centralized policies for consistent configuration
- Firmware Management: Automated firmware updates across infrastructure
- Role-Based Access Control (RBAC): Granular user permissions
- Fabric Interconnects: Unified fabric for network, storage, and management
- Stateless Computing: Rapid server provisioning and reprovisioning
- Integration: VMware, Microsoft, KVM support
UCS Manager APIs
| API/Interface | Description | Use Case |
|---|---|---|
| XML API | Native UCS Manager API using XML over HTTP/HTTPS | Automation, integration, custom tools |
| Python SDK (ucsmsdk) | Python library wrapping XML API | Python automation scripts |
| PowerTool | PowerShell cmdlets for UCS | Windows automation |
| Ansible Modules | Native Ansible support | Configuration management |
| Terraform Provider | Infrastructure as Code | Declarative provisioning |
https://{ucs-manager-ip}/nuovaAuthentication: Cookie-based session
SDK Installation:
pip install ucsmsdk
Python UCS Manager SDK Example
#!/usr/bin/env python3
"""
Cisco UCS Manager Python SDK Example
Demonstrates basic operations using ucsmsdk
"""
from ucsmsdk.ucshandle import UcsHandle
# Connect to UCS Manager
def connect_ucs(ip, username, password):
"""Establish connection to UCS Manager"""
try:
handle = UcsHandle(ip, username, password)
handle.login()
print(f"ā
Connected to UCS Manager: {ip}")
return handle
except Exception as e:
print(f"ā Connection failed: {e}")
return None
# Get all blade servers
def get_blade_servers(handle):
"""Retrieve all blade server information"""
from ucsmsdk.mometa.compute.ComputeBlade import ComputeBlade
blades = handle.query_classid("ComputeBlade")
print("\n" + "="*70)
print("BLADE SERVERS")
print("="*70)
for blade in blades:
print(f"\nServer: {blade.dn}")
print(f" Model: {blade.model}")
print(f" Serial: {blade.serial}")
print(f" CPUs: {blade.num_of_cpus}")
print(f" Memory: {blade.total_memory} MB")
print(f" Status: {blade.oper_state}")
return blades
# Get service profiles
def get_service_profiles(handle):
"""Retrieve all service profiles"""
from ucsmsdk.mometa.ls.LsServer import LsServer
profiles = handle.query_classid("LsServer")
print("\n" + "="*70)
print("SERVICE PROFILES")
print("="*70)
for profile in profiles:
print(f"\nProfile: {profile.name}")
print(f" DN: {profile.dn}")
print(f" Type: {profile.type}")
print(f" Assignment: {profile.assign_state}")
print(f" Associated Server: {profile.pn_dn}")
return profiles
# Create a service profile (template)
def create_service_profile(handle, org_name, profile_name):
"""Create a new service profile from template"""
from ucsmsdk.mometa.ls.LsServer import LsServer
# Get organization
org_dn = f"org-root/org-{org_name}"
# Create service profile object
sp = LsServer(
parent_mo_or_dn=org_dn,
name=profile_name,
type="instance",
descr="Created via Python SDK"
)
# Add to UCS Manager
handle.add_mo(sp, modify_present=True)
handle.commit()
print(f"ā
Service Profile '{profile_name}' created")
return sp
# Main execution
if __name__ == "__main__":
# Connection parameters
UCS_IP = "10.10.10.10"
USERNAME = "admin"
PASSWORD = "password"
# Connect
handle = connect_ucs(UCS_IP, USERNAME, PASSWORD)
if handle:
# Get blade servers
blades = get_blade_servers(handle)
# Get service profiles
profiles = get_service_profiles(handle)
# Logout
handle.logout()
print("\nā
Disconnected from UCS Manager")
- Automated server provisioning with service profiles
- Firmware upgrades across multiple servers
- Configuration backup and restore
- Monitoring and alerting
- Integration with orchestration tools (vCenter, SCVMM)
- Capacity planning and utilization reporting
2. Cisco Intersight
Intersight Cloud-Based Infrastructure Management
Cisco Intersight is a cloud-based management platform providing intelligent, automated management of Cisco UCS and HyperFlex systems from anywhere.
Key Capabilities
- Cloud-Based Management: Manage infrastructure from anywhere
- AI/ML Insights: Proactive recommendations and analytics
- Zero-Touch Deployment: Automated server discovery and onboarding
- Unified Management: UCS, HyperFlex, and third-party servers
- Workload Optimizer: Application performance optimization
- Policy-Based Automation: Consistent, repeatable deployments
- Integrated Licensing: Simplified license management
- API-First Architecture: Everything is API-accessible
Intersight APIs
| API Type | Description |
|---|---|
| REST API | RESTful API with JSON payloads |
| Python SDK | intersight Python package |
| PowerShell SDK | PowerShell cmdlets |
| Terraform Provider | Infrastructure as Code support |
| Ansible Collections | Native Ansible modules |
https://intersight.com/api/v1Authentication: API Key + Secret (HMAC signing)
SDK Installation:
pip install intersight
Python Intersight SDK Example
#!/usr/bin/env python3
"""
Cisco Intersight Python SDK Example
Demonstrates server inventory and management
"""
import intersight
from intersight.api import compute_api
from intersight.model.compute_physical_summary_list import ComputePhysicalSummaryList
# Configure API client
def configure_api_client(api_key_id, api_key_file):
"""Configure Intersight API client"""
configuration = intersight.Configuration(
host="https://intersight.com",
signing_info=intersight.HttpSigningConfiguration(
key_id=api_key_id,
private_key_path=api_key_file,
signing_scheme=intersight.signing.SCHEME_HS2019,
signing_algorithm=intersight.signing.ALGORITHM_RSASSA_PSS,
hash_algorithm=intersight.signing.HASH_SHA256,
)
)
return intersight.ApiClient(configuration)
# Get all servers
def get_servers(api_client):
"""Retrieve all physical servers"""
api_instance = compute_api.ComputeApi(api_client)
try:
# Query servers
result = api_instance.get_compute_physical_summary_list()
print("="*70)
print("INTERSIGHT - SERVER INVENTORY")
print("="*70)
for server in result.results:
print(f"\nServer: {server.name}")
print(f" Model: {server.model}")
print(f" Serial: {server.serial}")
print(f" Management Mode: {server.management_mode}")
print(f" CPUs: {server.num_cpus}")
print(f" Memory: {server.total_memory} MB")
print(f" Status: {server.oper_state}")
return result.results
except Exception as e:
print(f"ā Error: {e}")
return None
# Get alarms
def get_alarms(api_client):
"""Retrieve active alarms"""
from intersight.api import cond_api
api_instance = cond_api.CondApi(api_client)
try:
result = api_instance.get_cond_alarm_list(
filter="Severity eq 'Critical'"
)
print("\n" + "="*70)
print("CRITICAL ALARMS")
print("="*70)
for alarm in result.results:
print(f"\nAlarm: {alarm.name}")
print(f" Severity: {alarm.severity}")
print(f" Description: {alarm.description}")
print(f" Created: {alarm.create_time}")
return result.results
except Exception as e:
print(f"ā Error: {e}")
return None
# Main execution
if __name__ == "__main__":
API_KEY_ID = "your-api-key-id"
API_KEY_FILE = "/path/to/SecretKey.txt"
# Configure client
api_client = configure_api_client(API_KEY_ID, API_KEY_FILE)
# Get servers
servers = get_servers(api_client)
# Get alarms
alarms = get_alarms(api_client)
print("\nā
Intersight operations complete")
- Cloud-Based: No on-premises management appliance needed
- AI-Driven: Predictive analytics and proactive recommendations
- Always Current: Automatic updates, no manual patching
- Scalable: Manage thousands of servers globally
- Secure: End-to-end encryption, role-based access
- Open: API-first design for easy integration
UCS Manager vs Intersight
| Feature | UCS Manager | Intersight |
|---|---|---|
| Deployment | On-premises (embedded) | Cloud-based SaaS |
| Management Scope | Single UCS domain | Global, multi-site |
| Access | Local network only | Anywhere with internet |
| Analytics | Basic monitoring | AI/ML insights |
| Updates | Manual upgrades | Automatic updates |
| API | XML-based | RESTful JSON |
| Best For | Traditional data center | Hybrid/multi-cloud |
š¬ 3.4 Cisco Collaboration Platforms
Overview
Cisco provides comprehensive collaboration solutions including cloud-based Webex and on-premises Unified Communications Manager (CUCM), all with robust APIs for customization and integration.
1. Cisco Webex
Webex Cloud Collaboration Platform
Webex is Cisco's cloud-based collaboration platform providing meetings, messaging, calling, and device management through comprehensive APIs.
Key Capabilities
- Webex Meetings: HD video conferencing with screen sharing
- Webex Messaging: Team collaboration with spaces and direct messaging
- Webex Calling: Cloud calling with PSTN connectivity
- Webex Devices: Room systems, desk phones, boards
- Webex Assistant: Voice-activated meeting control
- Integrations: 1000+ integrations with business apps
- Security: End-to-end encryption, compliance certified
- APIs: RESTful APIs for all features
Webex APIs
| API Category | Capabilities |
|---|---|
| Meetings API | Create, list, join meetings; manage participants |
| Messaging API | Send/receive messages, create spaces, manage memberships |
| Devices API | Monitor and control Webex devices |
| Admin API | User management, organization settings, reports |
| Webhooks | Real-time event notifications |
| Bots | Automated assistants in Webex spaces |
https://webexapis.com/v1Authentication: Bearer Token (OAuth 2.0)
SDK:
pip install webexteamssdk
Webex Python SDK Example
#!/usr/bin/env python3
"""
Cisco Webex Teams SDK Example
Demonstrates messaging and space management
"""
from webexteamssdk import WebexTeamsAPI
# Initialize API
api = WebexTeamsAPI(access_token="YOUR_ACCESS_TOKEN")
# List all spaces (rooms)
def list_spaces():
"""List all Webex spaces"""
print("="*70)
print("WEBEX SPACES")
print("="*70)
spaces = api.rooms.list()
for space in spaces:
print(f"\nSpace: {space.title}")
print(f" ID: {space.id}")
print(f" Type: {space.type}")
print(f" Created: {space.created}")
return list(spaces)
# Create a new space
def create_space(title):
"""Create a new Webex space"""
space = api.rooms.create(title=title)
print(f"ā
Space '{title}' created: {space.id}")
return space
# Send a message
def send_message(room_id, text):
"""Send message to a space"""
message = api.messages.create(
roomId=room_id,
text=text
)
print(f"ā
Message sent: {message.id}")
return message
# Send message with attachment
def send_message_with_file(room_id, text, file_url):
"""Send message with file attachment"""
message = api.messages.create(
roomId=room_id,
text=text,
files=[file_url]
)
print(f"ā
Message with file sent")
return message
# List messages in a space
def list_messages(room_id, max_messages=10):
"""List recent messages in a space"""
print(f"\nMessages in space (last {max_messages}):")
messages = api.messages.list(
roomId=room_id,
max=max_messages
)
for msg in messages:
print(f"\n From: {msg.personEmail}")
print(f" Text: {msg.text}")
print(f" Time: {msg.created}")
return list(messages)
# Create a webhook
def create_webhook(name, target_url, resource, event):
"""Create a webhook for real-time events"""
webhook = api.webhooks.create(
name=name,
targetUrl=target_url,
resource=resource,
event=event
)
print(f"ā
Webhook created: {webhook.id}")
return webhook
# List people
def list_people(email=None, display_name=None):
"""Search for people"""
if email:
people = api.people.list(email=email)
elif display_name:
people = api.people.list(displayName=display_name)
else:
people = api.people.list(max=10)
print("\nPeople:")
for person in people:
print(f" {person.displayName} ({person.emails[0]})")
return list(people)
# Main execution
if __name__ == "__main__":
# List spaces
spaces = list_spaces()
# Create a space
new_space = create_space("DevOps Team")
# Send message
send_message(new_space.id, "Hello from Python!")
print("\nā
Webex operations complete")
Webex Devices API
Control and monitor Webex room devices, desk devices, and boards:
# Webex Devices API Example
import requests
# List all devices
def list_devices(access_token):
"""List all Webex devices in organization"""
url = "https://webexapis.com/v1/devices"
headers = {"Authorization": f"Bearer {access_token}"}
response = requests.get(url, headers=headers)
devices = response.json()
for device in devices.get('items', []):
print(f"Device: {device['displayName']}")
print(f" Product: {device['product']}")
print(f" Status: {device['connectionStatus']}")
print(f" IP: {device.get('ip', 'N/A')}")
# Send command to device (xAPI)
def send_xapi_command(device_id, access_token, command):
"""Execute xAPI command on device"""
url = f"https://webexapis.com/v1/xapi/command/{command}"
headers = {"Authorization": f"Bearer {access_token}"}
data = {"deviceId": device_id}
response = requests.post(url, headers=headers, json=data)
return response.json()
2. Cisco Unified Communications Manager (CUCM)
CUCM On-Premises Call Control
Cisco Unified Communications Manager is an on-premises call-processing solution providing voice, video, messaging, and mobility services.
Key Capabilities
- Call Control: Enterprise-grade voice and video calling
- Device Management: IP phones, gateways, conferencing
- Dial Plan: Complex routing and digit manipulation
- Mobility: Extension mobility, mobile and remote access
- Hunt Groups: Call distribution to teams
- Voicemail: Integration with Unity Connection
- Survivability: SRST for branch office survivability
- APIs: AXL (SOAP), UDS (REST), JTAPI, CTI
CUCM APIs and Interfaces
| API/Interface | Protocol | Purpose |
|---|---|---|
| AXL (Admin XML) | SOAP/XML | Configuration management (CRUD operations) |
| UDS (User Data Services) | REST/JSON | User information, directories, device associations |
| RIS (Realtime Info Server) | SOAP | Device status, registration information |
| JTAPI | Java | Call control, telephony applications |
| CTI (Computer Telephony Integration) | Various | Screen pops, call control integration |
AXL:
https://{cucm}:8443/axl/UDS:
https://{cucm}:8443/cucm-uds/Authentication: Basic Auth (application user)
AXL API Example (SOAP)
AXL provides full CRUD operations on CUCM configuration:
#!/usr/bin/env python3
"""
CUCM AXL API Example
Administrative operations using SOAP
"""
from zeep import Client
from zeep.transports import Transport
from requests import Session
from requests.auth import HTTPBasicAuth
import urllib3
# Disable SSL warnings (for lab environments)
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
class CUCMAxl:
"""CUCM AXL API Client"""
def __init__(self, host, username, password, version='12.5'):
self.host = host
self.username = username
self.password = password
self.version = version
# Setup SOAP client
wsdl = f'https://{host}:8443/axl/DB/{version}/AXLAPI.wsdl'
session = Session()
session.auth = HTTPBasicAuth(username, password)
session.verify = False
transport = Transport(session=session, timeout=10)
self.client = Client(wsdl, transport=transport)
self.service = self.client.create_service(
"{http://www.cisco.com/AXLAPIService/}AXLAPIBinding",
f'https://{host}:8443/axl/'
)
def list_phones(self):
"""List all IP phones"""
try:
resp = self.service.listPhone(
searchCriteria={'name': '%'},
returnedTags={'name': '', 'model': '', 'description': ''}
)
print("="*70)
print("CUCM IP PHONES")
print("="*70)
if resp['return']:
for phone in resp['return']['phone']:
print(f"\nPhone: {phone['name']}")
print(f" Model: {phone['model']}")
print(f" Description: {phone.get('description', 'N/A')}")
return resp['return']['phone'] if resp['return'] else []
except Exception as e:
print(f"ā Error: {e}")
return []
def get_phone(self, name):
"""Get specific phone details"""
try:
resp = self.service.getPhone(name=name)
phone = resp['return']['phone']
print(f"\nPhone Details: {name}")
print(f" Model: {phone['model']}")
print(f" Description: {phone.get('description', 'N/A')}")
print(f" Device Pool: {phone['devicePoolName']['_value_1']}")
print(f" CSS: {phone.get('callingSearchSpaceName', {}).get('_value_1', 'N/A')}")
return phone
except Exception as e:
print(f"ā Error: {e}")
return None
def add_phone(self, name, description, model='Cisco 8861'):
"""Add a new IP phone"""
try:
phone_data = {
'name': name,
'description': description,
'product': model,
'devicePoolName': 'Default',
'locationName': 'Hub_None',
'class': 'Phone',
'protocol': 'SIP',
'protocolSide': 'User',
'commonPhoneConfigName': 'Standard Common Phone Profile'
}
resp = self.service.addPhone(phone_data)
print(f"ā
Phone '{name}' added successfully")
return resp
except Exception as e:
print(f"ā Error adding phone: {e}")
return None
def update_phone(self, name, description):
"""Update phone description"""
try:
resp = self.service.updatePhone(
name=name,
description=description
)
print(f"ā
Phone '{name}' updated")
return resp
except Exception as e:
print(f"ā Error: {e}")
return None
def delete_phone(self, name):
"""Delete a phone"""
try:
resp = self.service.removePhone(name=name)
print(f"ā
Phone '{name}' deleted")
return resp
except Exception as e:
print(f"ā Error: {e}")
return None
# Main execution
if __name__ == "__main__":
# Initialize AXL client
cucm = CUCMAxl(
host='cucm.example.com',
username='axluser',
password='password',
version='12.5'
)
# List all phones
phones = cucm.list_phones()
# Get specific phone
if phones:
cucm.get_phone(phones[0]['name'])
UDS API Example (REST)
UDS provides RESTful access to user and device information:
#!/usr/bin/env python3
"""
CUCM UDS API Example
User and device queries using REST
"""
import requests
from requests.auth import HTTPBasicAuth
import urllib3
urllib3.disable_warnings()
class CUCMUDS:
"""CUCM User Data Services Client"""
def __init__(self, host, username, password):
self.base_url = f"https://{host}:8443/cucm-uds"
self.auth = HTTPBasicAuth(username, password)
self.headers = {'Accept': 'application/json'}
def get_user(self, userid):
"""Get user information"""
url = f"{self.base_url}/user/{userid}"
response = requests.get(
url,
auth=self.auth,
headers=self.headers,
verify=False
)
if response.status_code == 200:
user = response.json()['user']
print(f"\nUser: {user['userName']}")
print(f" First Name: {user['firstName']}")
print(f" Last Name: {user['lastName']}")
print(f" Email: {user.get('email', 'N/A')}")
print(f" Department: {user.get('department', 'N/A')}")
return user
else:
print(f"ā Error: {response.status_code}")
return None
def get_user_devices(self, userid):
"""Get devices associated with user"""
url = f"{self.base_url}/user/{userid}/devices"
response = requests.get(
url,
auth=self.auth,
headers=self.headers,
verify=False
)
if response.status_code == 200:
devices = response.json()['devices']['device']
print(f"\nDevices for user {userid}:")
for device in devices:
print(f" - {device['name']} ({device['model']})")
return devices
else:
print(f"ā Error: {response.status_code}")
return []
# Usage
uds = CUCMUDS('cucm.example.com', 'username', 'password')
user = uds.get_user('jsmith')
devices = uds.get_user_devices('jsmith')
Comparison: Webex vs CUCM
| Feature | Webex | CUCM |
|---|---|---|
| Deployment | Cloud (SaaS) | On-premises |
| Management | Web portal | Admin GUI, CLI |
| API Style | RESTful JSON | SOAP (AXL), REST (UDS) |
| Authentication | OAuth 2.0 | Basic Auth |
| Meetings | Built-in | Requires Webex integration |
| Messaging | Native team collaboration | IM via Jabber |
| Best For | Modern collaboration, remote work | Enterprise voice, on-prem requirements |
š Interactive Python Interpreter
- Write Python code in the editor below
- Click "ā¶ Run Code" to execute
- Output appears in the console below
- Use sample codes for platform demonstrations