Automating vSphere Configuration Profile APIs – Part 2 – PowerCLI and Python Sample Code
Published: (February 18, 2026 at 03:42 AM EST)
3 min read
Source: VMware Blog
Source: VMware Blog
vSphere Configuration Profile API – Python Sample
Author: Jatin Purohit
Title: Product Marketing Engineer, Broadcom
Transition a cluster to be managed by vSphere Configuration Profile
import requests
import urllib3
import json
import time
from vmware.vapi.vsphere.client import create_vsphere_client
# ESXi settings services
from com.vmware.esx.settings.clusters.enablement_client import Configuration
from com.vmware.esx.settings.clusters_client import Configuration as ClusterConfiguration
from com.vmware.esx.settings.clusters.enablement.configuration_client import Transition
from com.vmware.esx.settings.clusters.configuration.reports_client import LastComplianceResult
from com.vmware.esx.settings.clusters.configuration_client import Drafts
# -------------------------------------------------------------------------
# Create a vSphere client session
# -------------------------------------------------------------------------
session = requests.session()
session.verify = False # Disable SSL verification (for demo only)
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
vsphere_client = create_vsphere_client(
server='vc_fqdn_or_ip',
username='vc_username',
password='vc_password',
session=session
)
print(f"\033[92mConnected to vCenter Server, Session ID: \033[0m{vsphere_client.session_id}")
# =============================================================================
# 1️⃣ Transition a cluster to be managed by vSphere Configuration Profile
# =============================================================================
# -------------------------------------------------------------------------
# Check VCP enablement status on the cluster
# -------------------------------------------------------------------------
print("\033[92m1. Checking VCP Configuration for cluster: domain-c10 \033[0m")
print("GET /esx/settings/clusters/:cluster/enablement/configuration")
vcp_service = Configuration(vsphere_client._stub_config)
result = vcp_service.get(cluster="domain-c10")
print(f"\033[92mvSphere Configuration Profile Enablement Status on cluster domain-c10: \033[0m{result.enabled}")
# -------------------------------------------------------------------------
# Invoke cluster eligibility check for VCP transition
# -------------------------------------------------------------------------
print("\n\033[92m2. Invoking Cluster Eligibility Check for Configuration Transition... \033[0m")
print("POST /esx/settings/clusters/:cluster/enablement/configuration/transition?action=checkEligibility&vmw-task=true")
transition_service = Transition(vsphere_client._stub_config)
check_eligibility_task = transition_service.check_eligibility_task(cluster="domain-c10")
print(f"\033[92mCluster Eligibility check initiated successfully. VMware Task ID: \033[0m{check_eligibility_task.task_id}")
time.sleep(120) # Wait for the task to complete (adjust as needed)
# -------------------------------------------------------------------------
# Import Configuration Profile from a reference host
# -------------------------------------------------------------------------
print("\n\033[92m3. Importing Configuration Profile from reference Host for VCP Transition... \033[0m")
print("POST /esx/settings/clusters/:cluster/enablement/configuration/transition?action=importFromHost&vmw-task=true")
import_task = transition_service.import_from_host_task(cluster="domain-c10", host="host-13")
print(f"\033[92mConfiguration Profile import initiated successfully. VMware Task ID: \033[0m{import_task.task_id}")
time.sleep(120)
# -------------------------------------------------------------------------
# Validate the imported Configuration Profile
# -------------------------------------------------------------------------
print("\n\033[92m4. Validating Imported Cluster Configuration Profile for VCP Transition... \033[0m")
print("POST /esx/settings/clusters/:cluster/enablement/configuration/transition?action=validateConfig&vmw-task=true")
validate_task = transition_service.validate_config_task(cluster="domain-c10")
print(f"\033[92mConfiguration Profile validation initiated successfully. VMware Task ID: \033[0m{validate_task.task_id}")
time.sleep(120)
# -------------------------------------------------------------------------
# Enable VCP on the cluster using the imported profile
# -------------------------------------------------------------------------
print("\n\033[92m5. Enabling VCP on Cluster using Imported Configuration Profile... \033[0m")
print("POST /esx/settings/clusters/:cluster/enablement/configuration/transition?action=enable&vmw-task=true")
enable_task = transition_service.enable_task(cluster="domain-c10")
print(f"\033[92mVCP Enablement initiated successfully. VMware Task ID: \033[0m{enable_task.task_id}")
time.sleep(120)
# -------------------------------------------------------------------------
# Verify VCP enablement status after transition
# -------------------------------------------------------------------------
print("\n\033[92m6. Checking VCP Configuration for cluster: domain-c10 \033[0m")
print("GET /esx/settings/clusters/:cluster/enablement/configuration")
vcp_service = Configuration(vsphere_client._stub_config)
result = vcp_service.get(cluster="domain-c10")
print(f"\033[92mvSphere Configuration Profile Enablement Status on cluster domain-c10: \033[0m{result.enabled}")
Manage Desired State Configuration (DSC) on the Cluster
# =============================================================================
# 2️⃣ Manage Desired State Configuration (DSC) on the Cluster
# =============================================================================
# -------------------------------------------------------------------------
# Check cluster compliance status with Desired State Configuration
# -------------------------------------------------------------------------
print("\n\033[92m7. Checking Cluster Compliance Status with Desired State Configuration... \033[0m")
print("GET /esx/settings/clusters/:cluster/configuration?action=checkCompliance&vmw-task=true")
compliance_service = ClusterConfiguration(vsphere_client._stub_config)
compliance_task = compliance_service.check_compliance_task(cluster="domain-c10")
print(f"\033[92mCluster Compliance Status task ID: \033[0m{compliance_task.get_task_id()}")
# -------------------------------------------------------------------------
# Retrieve the latest compliance result
# -------------------------------------------------------------------------
print("\n\033[92m8. Validating Cluster Desired State Configuration Compliance Results... \033[0m")
print("GET /esx/settings/clusters/:cluster/configuration/reports/last-compliance-result")
report_service = LastComplianceResult(vsphere_client._stub_config)
compliance_report = report_service.get(cluster="domain-c10")
print(f"\033[92mCompliance Result Status: \033[0m{compliance_report.cluster_status}")
# -------------------------------------------------------------------------
# Create a configuration draft for the cluster
# -------------------------------------------------------------------------
print("\n\033[92m9. Creating Configuration Draft for Cluster... \033[0m")
print("POST /esx/settings/clusters/:cluster/configuration/drafts")
draft_service = Drafts(vsphere_client._stub_config)
draft_id = draft_service.create(cluster="domain-c10")
print(f"\033[92mDraft created with ID: \033[0m{draft_id}")
Note
- The script disables SSL verification (
session.verify = False) and suppresses related warnings – this is only appropriate for testing in a trusted environment. time.sleep(120)is used as a simple way to wait for asynchronous tasks to finish; in production you’d poll the task status instead of using a fixed delay.- Replace placeholder values (
vc_fqdn_or_ip,vc_username,vc_password,domain-c10,host-13) with the actual identifiers from your environment.
# Configuration Draft created successfully, Draft ID: {draft_id}
print("\n\033[92m10. Exporting Cluster Configuration from Draft...\033[0m")
print("POST /esx/settings/clusters/:cluster/configuration/drafts/{draft}?action=exportConfig")
draft_config = draft_service.export_config(cluster="domain-c10", draft=draft_id)
print(draft_config)
# Convert the returned object to a mutable