šŸ–„ļø Cisco Compute & Collaboration

UCS, Intersight, Webex & Unified Communications

šŸ–„ļø 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.

graph LR A["Cisco Compute Solutions"] --> B["UCS Manager"] A --> C["Intersight"] B --> B1["On-Premises"] B --> B2["Traditional Management"] B --> B3["UCS Fabric"] C --> C1["Cloud-Based"] C --> C2["AI/ML Insights"] C --> C3["Multi-Cloud"] style A fill:#667eea,stroke:#764ba2,stroke-width:3px,color:#fff style B fill:#42a5f5,stroke:#1976d2,stroke-width:2px,color:#fff style C fill:#ab47bc,stroke:#6a1b9a,stroke-width:2px,color:#fff

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
šŸ“Œ API Access:
https://{ucs-manager-ip}/nuova
Authentication: 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")
āœ… Common UCS Manager Use Cases:
  • 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
šŸ“Œ API Access:
https://intersight.com/api/v1
Authentication: 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")
āœ… Intersight Advantages:
  • 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.

graph TD A["Cisco Collaboration"] --> B["Webex"] A --> C["CUCM"] B --> B1["Meetings API"] B --> B2["Messaging API"] B --> B3["Devices API"] B --> B4["Calling API"] C --> C1["AXL SOAP"] C --> C2["UDS REST"] C --> C3["JTAPI"] C --> C4["CTI"] style A fill:#667eea,stroke:#764ba2,stroke-width:3px,color:#fff style B fill:#66bb6a,stroke:#2e7d32,stroke-width:2px,color:#fff style C fill:#ffa726,stroke:#e65100,stroke-width:2px,color:#fff

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
šŸ“Œ API Access:
https://webexapis.com/v1
Authentication: 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
šŸ“Œ API Access:
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

šŸ’” How to use:
  • Write Python code in the editor below
  • Click "ā–¶ Run Code" to execute
  • Output appears in the console below
  • Use sample codes for platform demonstrations
šŸ“ Python Code Editor
⚔ Console Output
Ready to execute Python code...