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

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
0 views
Back to Blog

Related posts

Read more »

Python Generator

Generator Functions Generator functions are a special kind of function that return a lazy iterator. These objects can be looped over like a list, but unlike li...