Automatizando APIs de Perfil de Configuração do vSphere – Parte 2 – Código de Exemplo PowerCLI e Python

Bem-vindo de volta à nossa série sobre Automação de vSphere Configuration Profile (VCP). Na Parte 1, detalhamos as principais APIs do VCP e como elas mantêm o "estado desejado" dos clusters vSphere. Agora, é hora de colocar as mãos no código. Esta publicação de blog explica como consumir essas APIs usando as ferramentas mais familiares para administradores de VI e desenvolvedores: PowerCLI e Python.
Consumindo APIs VCP Usando o PowerCLI SDK
Se você já vive no mundo PowerShell, o PowerCLI SDK é seu melhor amigo. Ele fornece acesso direto e de baixo nível às APIs do VMware Cloud Foundation (VCF) e vSphere Automation, tornando-o uma opção natural para pipelines de automação existentes.
Dica Profissional: Se você é novo na arquitetura mais recente do SDK, confira minha recente publicação de blog, Desmistificando o VCF PowerCLI 9.0 SDK, para entender como as novas bindings funcionam.
Primeiros Passos
Para começar, certifique-se de ter o VCF PowerCLI 9.0 (ou posterior) instalado. A magia deste SDK reside em sua capacidade de descoberta; você não precisa adivinhar os nomes dos comandos se já souber o URI REST.
Encontrando Seu Comando
O cmdlet Get-vSphereOperation é a "Pedra de Roseta" para mapear APIs REST para PowerCLI. Vejamos uma tarefa comum do VCP: verificar o status de habilitação de um cluster.
GET https://{api_host}/api/esx/settings/clusters/{cluster}/enablement/configuration
GET https://{api_host}/api/esx/settings/clusters/{cluster}/enablement/configuration
O Comando de Descoberta:
Get-vSphereOperation -Method GET -Path "/api/esx/settings/clusters/{cluster}/enablement/configuration"
Get-vSphereOperation -Method GET -Path "/api/esx/settings/clusters/{cluster}/enablement/configuration"
Executar isso retornará um objeto CommandInfo. Uma vez que você o tenha, pode invocar a operação correspondente. O exemplo de código PowerCLI abaixo demonstra o processo de habilitação de vSphere Configuration Profiles (VCP) em um cluster vSphere. Além disso, ele ilustra como gerenciar, atualizar e configurar o estado desejado usando as APIs de rascunho do VCP.
#vSphere Configuration Profile API, Exemplo em PowerShell
#Autor: Jatin Purohit
#Título: Product Marketing Engineer, Broadcom
#Publicação de Blog da API:
#https://blogs.vmware.com/cloud-foundation/2026/01/22/vsphere-configuration-profile/
$vc = "vc-fqdn-or-ip"
$cred = Get-Credential -Message "Digite as Credenciais do vCenter"
Connect-VIServer -Server $vc -Credential $cred
$cluster = Get-Cluster -Name "cluster-name"
#########################################################################################
# Transição de um cluster para ser gerenciado pelo vSphere Configuration Profile
#########################################################################################
# Verificar se o Cluster é gerenciado pela vSphere Configuration API
$IsVCPEnabled = Invoke-GetClusterEnablementConfiguration -Cluster $cluster.ExtensionData.Moref.Value
Write-Host "vSphere Configuration Profile Habilitado:" $IsVCPEnabled.Enabled
# Invocar Verificação de Elegibilidade do Cluster para Transição de Configuração, se ainda não habilitado
if (-not $IsVCPEnabled.Enabled) {
Invoke-CheckEligibilityClusterConfigurationTransitionAsync -Cluster $cluster.ExtensionData.Moref.Value -Confirm:$false
}
# Importar Configuration Profile de um host de referência
$referenceHost = Get-VMHost -Name "esx-fqdn-or-ip"
$body = $referenceHost.ExtensionData.Moref.Value
Invoke-ImportFromHostClusterConfigurationTransitionAsync -Body $body -Cluster $cluster.ExtensionData.MoRef.Value -Confirm:$false
# Validar a configuração do cluster
Invoke-ValidateConfigClusterConfigurationTransitionAsync -Cluster $cluster.ExtensionData.Moref.Value -Confirm:$false
# Habilitar o vSphere Configuration Profile no cluster
Invoke-EnableClusterConfigurationTransitionAsync -Cluster $cluster.ExtensionData.Moref.Value -Confirm:$false
Start-Sleep -Seconds 60
# Verificar se o vSphere Configuration Profile está habilitado
$IsVCPEnabled = Invoke-GetClusterEnablementConfiguration -Cluster $cluster.ExtensionData.Moref.Value
Write-Host "vSphere Configuration Profile Habilitado:" $IsVCPEnabled.Enabled
#########################################################################################
# Gerenciar a Configuração de Estado Desejado no Cluster usando o vSphere Configuration Profile
#########################################################################################
# Criar um Novo Rascunho de Configuração
$draftId = Invoke-CreateNewDraftClusterConfiguration -Cluster $cluster.ExtensionData.Moref.Value
Write-Host "ID do Rascunho de Configuração Inicializado:" $draftId
# Exportar a Configuração do Cluster do Rascunho de Configuração
$configuration = Invoke-GetClusterDraftConfiguration -Cluster $cluster.ExtensionData.Moref.Value -Draft $draftId
$configuration | Out-File ClusterConfig.json
# Modificar o JSON de Configuração do Cluster conforme necessário
# Por exemplo, alterando configurações de NTP, adicionando/removendo tags, etc.
# Carregar seu arquivo JSON em um Objeto PowerShell
$configObj = Get-Content ./ClusterConfig.json -Raw | ConvertFrom-Json
# Converter esse objeto em uma String JSON
# CRÍTICO: Usamos -Depth 10 para garantir que as configurações aninhadas de ESX/NSX não sejam perdidas
$configJsonString = $configObj | ConvertTo-Json -Depth 10
# Inicializar o UpdateSpec usando a STRING JSON
$updatedSpec = Initialize-SettingsClustersConfigurationDraftsUpdateSpec -Config $configJsonString
# Invocar a atualização para o Rascunho do Cluster
Invoke-UpdateClusterDraft -Cluster $cluster.ExtensionData.MoRef.Value -Draft $draftId -EsxSettingsClustersConfigurationDraftsUpdateSpec $updatedSpec
# Validar as Alterações de Configuração do Rascunho do Cluster
$configChanges = Invoke-GetClusterDraft0 -Cluster $cluster.ExtensionData.MoRef.Value -Draft $draftId
$configChanges | ConvertTo-Json -Depth 10
# Executar Pré-verificações no Rascunho de Configuração
Invoke-PrecheckClusterDraftAsync -Cluster $cluster.ExtensionData.MoRef.Value -Draft $draftId -Confirm:$false
Start-Sleep -Seconds 30
# Aplicar o Rascunho do Perfil de Configuração ao Cluster
Invoke-ApplyClusterDraft -Cluster $cluster.ExtensionData.MoRef.Value -Draft $draftId -Confirm:$false
# Monitorar o Job
# Verificar o Status de Conformidade do Cluster
Invoke-CheckComplianceClusterConfigurationAsync -Cluster $cluster.ExtensionData.MoRef.Value -Confirm:$false
$complianceResult = Invoke-GetClusterConfigurationReportsLastComplianceResult -Cluster $cluster.ExtensionData.MoRef.Value
Write-Host "Status de Conformidade do Cluster:" $complianceResult.ClusterStatus
Write-Host "Resumo de Conformidade do Cluster:" $complianceResult.Summary.DefaultMessage
Write-Host "Hosts em Conformidade:" $complianceResult.CompliantHosts
#vSphere Configuration Profile API, Exemplo em PowerShell
#Autor: Jatin Purohit
#Título: Product Marketing Engineer, Broadcom
#Publicação de Blog da API:
#https://blogs.vmware.com/cloud-foundation/2026/01/22/vsphere-configuration-profile/
$vc = "vc-fqdn-or-ip"
$cred = Get-Credential -Message "Digite as Credenciais do vCenter"
Connect-VIServer -Server $vc -Credential $cred
$cluster = Get-Cluster -Name "cluster-name"
#########################################################################################
# Transição de um cluster para ser gerenciado pelo vSphere Configuration Profile
#########################################################################################
# Verificar se o Cluster é gerenciado pela vSphere Configuration API
$IsVCPEnabled = Invoke-GetClusterEnablementConfiguration -Cluster $cluster.ExtensionData.Moref.Value
Write-Host "vSphere Configuration Profile Habilitado:" $IsVCPEnabled.Enabled
# Invocar Verificação de Elegibilidade do Cluster para Transição de Configuração, se ainda não habilitado
if (-not $IsVCPEnabled.Enabled) {
Invoke-CheckEligibilityClusterConfigurationTransitionAsync -Cluster $cluster.ExtensionData.Moref.Value -Confirm:$false
}
# Importar Configuration Profile de um host de referência
$referenceHost = Get-VMHost -Name "esx-fqdn-or-ip"
$body = $referenceHost.ExtensionData.Moref.Value
Invoke-ImportFromHostClusterConfigurationTransitionAsync -Body $body -Cluster $cluster.ExtensionData.MoRef.Value -Confirm:$false
# Validar a configuração do cluster
Invoke-ValidateConfigClusterConfigurationTransitionAsync -Cluster $cluster.ExtensionData.Moref.Value -Confirm:$false
# Habilitar o vSphere Configuration Profile no cluster
Invoke-EnableClusterConfigurationTransitionAsync -Cluster $cluster.ExtensionData.Moref.Value -Confirm:$false
Start-Sleep -Seconds 60
# Verificar se o vSphere Configuration Profile está habilitado
$IsVCPEnabled = Invoke-GetClusterEnablementConfiguration -Cluster $cluster.ExtensionData.Moref.Value
Write-Host "vSphere Configuration Profile Habilitado:" $IsVCPEnabled.Enabled
#########################################################################################
# Gerenciar a Configuração de Estado Desejado no Cluster usando o vSphere Configuration Profile
#########################################################################################
# Criar um Novo Rascunho de Configuração
$draftId = Invoke-CreateNewDraftClusterConfiguration -Cluster $cluster.ExtensionData.Moref.Value
Write-Host "ID do Rascunho de Configuração Inicializado:" $draftId
# Exportar a Configuração do Cluster do Rascunho de Configuração
$configuration = Invoke-GetClusterDraftConfiguration -Cluster $cluster.ExtensionData.Moref.Value -Draft $draftId
$configuration | Out-File ClusterConfig.json
# Modificar o JSON de Configuração do Cluster conforme necessário
# Por exemplo, alterando configurações de NTP, adicionando/removendo tags, etc.
# Carregar seu arquivo JSON em um Objeto PowerShell
$configObj = Get-Content ./ClusterConfig.json -Raw | ConvertFrom-Json
# Converter esse objeto em uma String JSON
# CRÍTICO: Usamos -Depth 10 para garantir que as configurações aninhadas de ESX/NSX não sejam perdidas
$configJsonString = $configObj | ConvertTo-Json -Depth 10
# Inicializar o UpdateSpec usando a STRING JSON
$updatedSpec = Initialize-SettingsClustersConfigurationDraftsUpdateSpec -Config $configJsonString
# Invocar a atualização para o Rascunho do Cluster
Invoke-UpdateClusterDraft -Cluster $cluster.ExtensionData.MoRef.Value -Draft $draftId -EsxSettingsClustersConfigurationDraftsUpdateSpec $updatedSpec
# Validar as Alterações de Configuração do Rascunho do Cluster
$configChanges = Invoke-GetClusterDraft0 -Cluster $cluster.ExtensionData.MoRef.Value -Draft $draftId
$configChanges | ConvertTo-Json -Depth 10
# Executar Pré-verificações no Rascunho de Configuração
Invoke-PrecheckClusterDraftAsync -Cluster $cluster.ExtensionData.MoRef.Value -Draft $draftId -Confirm:$false
Start-Sleep -Seconds 30
# Aplicar o Rascunho do Perfil de Configuração ao Cluster
Invoke-ApplyClusterDraft -Cluster $cluster.ExtensionData.MoRef.Value -Draft $draftId -Confirm:$false
# Monitorar o Job
# Verificar o Status de Conformidade do Cluster
Invoke-CheckComplianceClusterConfigurationAsync -Cluster $cluster.ExtensionData.MoRef.Value -Confirm:$false
$complianceResult = Invoke-GetClusterConfigurationReportsLastComplianceResult -Cluster $cluster.ExtensionData.MoRef.Value
Write-Host "Status de Conformidade do Cluster:" $complianceResult.ClusterStatus
Write-Host "Resumo de Conformidade do Cluster:" $complianceResult.Summary.DefaultMessage
Write-Host "Hosts em Conformidade:" $complianceResult.CompliantHosts
Consumindo APIs VCP Usando o Unified VCF SDK para Python
O Unified VCF SDK 9.0 para Python, introduzido no VCF 9.0, representa uma evolução significativa na automação de ambientes VMware. Este novo SDK simplifica o consumo de APIs VCF unificando o que antes eram bibliotecas separadas, como pyvmomi para SOAP, o vSphere Automation SDK para REST e um SDK vSAN dedicado para vSAN, em um único pacote. Desenvolvedores agora podem usar este único SDK para acessar todas as APIs VCF. Consulte a publicação de blog Introduzindo um Unified VCF SDK 9.0 para Python e Java para saber mais sobre a cobertura da API.
Melhorias Centrais no VCF SDK 9.0
- Empacotamento Consolidado: Agora você pode instalar o pacote completo com um único comando:
pip install vcf-sdk. - Autenticação Unificada: O maior problema nas versões anteriores era gerenciar diferentes sessões para endpoints SOAP (
/vim25) e REST (/api). Agora, você pode fazer login uma vez e compartilhar o ID da sessão entre ambos. - Cobertura Expandida: Inclui bindings para o novo VCF Installer, SDDC Manager e as mais recentes APIs do vSphere Configuration Profile (VCP).
Como as APIs VCP são Estruturadas no VCF SDK?
Para automatizar vSphere Configuration Profiles (VCP), você trabalhará principalmente dentro do namespace com.vmware.esx.settings.clusters.*. Em Python, o SDK é organizado em Módulos (que contêm a lógica do cliente) e Classes de Serviço (que contêm os métodos como get, list ou enable_task). Para realizar uma ação, você deve importar o módulo cliente específico e, em seguida, instanciar sua classe de serviço.*
Exemplo: Transicionando um Cluster para VCP
Uma das tarefas VCP mais comuns é mover um cluster de Host Profiles para VCP.
POST https://{api_host}/api/esx/settings/clusters/{cluster}/enablement/configuration/transition?action=enable
POST https://{api_host}/api/esx/settings/clusters/{cluster}/enablement/configuration/transition?action=enable
A Implementação em Python:
Para invocar isso, você usa a classe de serviço Transition encontrada dentro do módulo enablement.configuration_client.
-
Importar a Classe de Serviço Primeiro, importe a classe
Transitiondo módulo cliente apropriado:pythonfrom com.vmware.esx.settings.clusters.enablement.configuration_client import Transitionfrom com.vmware.esx.settings.clusters.enablement.configuration_client import Transition -
Inicializar o Endpoint de Serviço Uma vez importado, você cria um endpoint de serviço passando sua configuração de stub
vsphere_clientautenticada para o construtor da classe. Isso "conecta" a classe à sua sessão ativa.python# Criar o endpoint de serviço transition_service = Transition(vsphere_client._stub_config) # Executar a ação 'enable' como uma Tarefa do vCenter # Substitua "domain-c10" pelo seu Cluster MORef específico enable_task = transition_service.enable_task(cluster="domain-c10") print(f"ID da Tarefa de Habilitação do VCP: {enable_task}")# Criar o endpoint de serviço transition_service = Transition(vsphere_client._stub_config) # Executar a ação 'enable' como uma Tarefa do vCenter # Substitua "domain-c10" pelo seu Cluster MORef específico enable_task = transition_service.enable_task(cluster="domain-c10") print(f"ID da Tarefa de Habilitação do VCP: {enable_task}")
Ponto Chave: Embora o caminho da API REST forneça o "endereço" da operação, o Python SDK mapeia esses caminhos para uma hierarquia aninhada. Sempre procure o sufixo _client no nome do módulo para encontrar as classes que contêm os métodos de execução reais (os "verbos") para sua automação._
Confira o código de exemplo completo em Python para habilitar o VCP em um cluster vSphere.
"""
vSphere Configuration Profile API, Exemplo em Python
Autor: Jatin Purohit
Título: Product Marketing Engineer, Broadcom
Publicação de Blog da API:
https://blogs.vmware.com/cloud-foundation/2026/01/22/vsphere-configuration-profile/
"""
import requests
import urllib3
import json
from vmware.vapi.vsphere.client import create_vsphere_client
from com.vmware.esx.settings.clusters.enablement_client import Configuration
from com.vmware.esx.settings.clusters_client import Configuration
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
import time
session = requests.session()
session.verify = False
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# Criar Sessão do Cliente vSphere
vsphere_client = create_vsphere_client(
server='vc_fqdn_or_ip',
username='vc_username',
password='vc_password',
session=session
)
print(f"\033[92mConectado ao vCenter Server, ID da Sessão: \033[0m {vsphere_client.session_id}")
#########################################################################################
# Transição de um cluster para ser gerenciado pelo vSphere Configuration Profile
#########################################################################################
# Verificar Status de Habilitação do VCP no Cluster
print("\033[92m1. Verificando a Configuração VCP para o cluster: domain-c8 \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[92mStatus de Habilitação do vSphere Configuration Profile no cluster domain-c10: \033[0m {result.enabled} ")
# Invocar Verificação de Elegibilidade do Cluster para Transição VCP
print("\n\033[92m2. Invocando Verificação de Elegibilidade do Cluster para Transição de Configuração...\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[92mVerificação de Elegibilidade do Cluster iniciada com sucesso. ID da Tarefa VMware: \033[0m {check_eligibility_task.task_id}")
time.sleep(120)
# Importar Configuration Profile de um Host de referência para Transição VCP
print("\n\033[92m3. Importando Configuration Profile de um Host de referência para Transição VCP...\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[92mImportação do Configuration Profile iniciada com sucesso. ID da Tarefa VMware: \033[0m {import_task.task_id}")
time.sleep(120)
# Validar Configuration Profile de Cluster Importado para Transição VCP
print("\n\033[92m4. Validando Configuration Profile de Cluster Importado para Transição VCP...\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[92mValidação do Configuration Profile iniciada com sucesso. ID da Tarefa VMware: \033[0m {validate_task.task_id}")
time.sleep(120)
# Habilitar VCP no Cluster usando Configuration Profile Importado
print("\n\033[92m5. Habilitando VCP no Cluster usando Configuration Profile Importado...\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[92mHabilitação do VCP iniciada com sucesso. ID da Tarefa VMware: \033[0m {enable_task.task_id}")
time.sleep(120)
# Verificar Status de Habilitação do VCP no Cluster após a Transição
print("\n\033[92m6. Verificando a Configuração VCP para o 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[92mStatus de Habilitação do vSphere Configuration Profile no cluster domain-c10: \033[0m {result.enabled} ")
########################################################################################
# Gerenciar a Configuração de Estado Desejado no Cluster usando o vSphere Configuration Profile
########################################################################################
# Verificar Status de Conformidade do Cluster com a Configuração de Estado Desejado
print("\n\033[92m7. Verificando Status de Conformidade do Cluster com a Configuração de Estado Desejado...\033[0m")
print("GET /esx/settings/clusters/:cluster/configuration?action=checkCompliance&vmw-task=true")
compliance_service = Configuration(vsphere_client._stub_config)
result = compliance_service.check_compliance_task(cluster="domain-c10")
print(f"\033[92mStatus de Conformidade do Cluster: \033[0m {result.get_task_id()} ")
# Validar Resultados de Conformidade da Configuração de Estado Desejado do Cluster
print("\n\033[92m8. Validando Resultados de Conformidade da Configuração de Estado Desejado do Cluster...\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[92mStatus do Resultado de Conformidade: \033[0m {compliance_report.cluster_status} ")
# Criar Rascunho de Configuração para o Cluster
print("\n\033[92m9. Criando Rascunho de Configuração para o 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[92mRascunho de Configuração criado com sucesso, ID do Rascunho: \033[0m {draft_id}")
# Exportar Configuração do Cluster do Rascunho
print("\n\033[92m10. Exportando Configuração do Cluster do Rascunho...\033[0m")
print(f"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)
data = vars(draft_config).copy()
# analisar dados 'Config' para dicionário
if isinstance(data.get("config"), str):
try:
data["config"] = json.loads(data["config"])
except Exception:
pass # Deixar como está se não for JSON válido
with open("config_new.json", "w") as f:
json.dump(data, f, indent=2)
# Carregar o arquivo JSON em um objeto Python
with open("config.json", "r") as f:
config_obj = json.load(f)
# Converter o objeto Python de volta para uma string JSON
# config_json_string = json.dumps(config_obj["config"], indent=2)
# Atualizar o Rascunho de Configuração com novas configurações
print("\n\033[92m11. Atualizando o Rascunho de Configuração com novas configurações ...\033[0m")
print(f"POST /esx/settings/clusters/:cluster/configuration/drafts/{{draft}}?action=update ")
draft_spec = draft_service.UpdateSpec(expected_revision=None, config=config_json_string)
updated_draft = draft_service.update(cluster="domain-c10", draft=draft_id, spec=draft_spec)
# Executar Pré-verificação do Rascunho
print("\n\033[92m12. Executando Pré-verificação do Rascunho ...\033[0m")
precheck_task = draft_service.precheck_task(cluster="domain-c10", draft=draft_id)
print(f"POST /esx/settings/clusters/:cluster/configuration/drafts/{{draft}}?action=precheck&vmw-task=true")
print(f"\033[92mPré-verificação do Rascunho iniciada com sucesso. ID da Tarefa VMware: \033[0m {precheck_task.task_id}")
# Aplicar o Rascunho de Configuração
time.sleep(120)
print("\n\033[92m13. Aplicando o Rascunho de Configuração ...\033[0m")
print(f"POST /esx/settings/clusters/:cluster/configuration/drafts/{{draft}}?action=apply")
apply_task = draft_service.apply(cluster="domain-c10", draft=draft_id)
print(f"\033[92mRascunho de Configuração aplicado com sucesso. ID da Tarefa VMware: \033[0m {apply_task}")
```](streamdown:incomplete-link)
"""
vSphere Configuration Profile API, Exemplo em Python
Autor: Jatin Purohit
Título: Product Marketing Engineer, Broadcom
Publicação de Blog da API:
https://blogs.vmware.com/cloud-foundation/2026/01/22/vsphere-configuration-profile/
"""
import requests
import urllib3
import json
from vmware.vapi.vsphere.client import create_vsphere_client
from com.vmware.esx.settings.clusters.enablement_client import Configuration
from com.vmware.esx.settings.clusters_client import Configuration
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
import time
session = requests.session()
session.verify = False
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# Criar Sessão do Cliente vSphere
vsphere_client = create_vsphere_client(
server='vc_fqdn_or_ip',
username='vc_username',
password='vc_password',
session=session
)
print(f"\033[92mConectado ao vCenter Server, ID da Sessão: \033[0m {vsphere_client.session_id}")
#########################################################################################
# Transição de um cluster para ser gerenciado pelo vSphere Configuration Profile
#########################################################################################
# Verificar Status de Habilitação do VCP no Cluster
print("\033[92m1. Verificando a Configuração VCP para o cluster: domain-c8 \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[92mStatus de Habilitação do vSphere Configuration Profile no cluster domain-c10: \033[0m {result.enabled} ")
# Invocar Verificação de Elegibilidade do Cluster para Transição VCP
print("\n\033[92m2. Invocando Verificação de Elegibilidade do Cluster para Transição de Configuração...\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[92mVerificação de Elegibilidade do Cluster iniciada com sucesso. ID da Tarefa VMware: \033[0m {check_eligibility_task.task_id}")
time.sleep(120)
# Importar Configuration Profile de um Host de referência para Transição VCP
print("\n\033[92m3. Importando Configuration Profile de um Host de referência para Transição VCP...\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[92mImportação do Configuration Profile iniciada com sucesso. ID da Tarefa VMware: \033[0m {import_task.task_id}")
time.sleep(120)
# Validar Configuration Profile de Cluster Importado para Transição VCP
print("\n\033[92m4. Validando Configuration Profile de Cluster Importado para Transição VCP...\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[92mValidação do Configuration Profile iniciada com sucesso. ID da Tarefa VMware: \033[0m {validate_task.task_id}")
time.sleep(120)
# Habilitar VCP no Cluster usando Configuration Profile Importado
print("\n\033[92m5. Habilitando VCP no Cluster usando Configuration Profile Importado...\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[92mHabilitação do VCP iniciada com sucesso. ID da Tarefa VMware: \033[0m {enable_task.task_id}")
time.sleep(120)
# Verificar Status de Habilitação do VCP no Cluster após a Transição
print("\n\033[92m6. Verificando a Configuração VCP para o 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[92mStatus de Habilitação do vSphere Configuration Profile no cluster domain-c10: \033[0m {result.enabled} ")
########################################################################################
# Gerenciar a Configuração de Estado Desejado no Cluster usando o vSphere Configuration Profile
########################################################################################
# Verificar Status de Conformidade do Cluster com a Configuração de Estado Desejado
print("\n\033[92m7. Verificando Status de Conformidade do Cluster com a Configuração de Estado Desejado...\033[0m")
print("GET /esx/settings/clusters/:cluster/configuration?action=checkCompliance&vmw-task=true")
compliance_service = Configuration(vsphere_client._stub_config)
result = compliance_service.check_compliance_task(cluster="domain-c10")
print(f"\033[92mStatus de Conformidade do Cluster: \033[0m {result.get_task_id()} ")
# Validar Resultados de Conformidade da Configuração de Estado Desejado do Cluster
print("\n\033[92m8. Validando Resultados de Conformidade da Configuração de Estado Desejado do Cluster...\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[92mStatus do Resultado de Conformidade: \033[0m {compliance_report.cluster_status} ")
# Criar Rascunho de Configuração para o Cluster
print("\n\033[92m9. Criando Rascunho de Configuração para o 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[92mRascunho de Configuração criado com sucesso, ID do Rascunho: \033[0m {draft_id}")
# Exportar Configuração do Cluster do Rascunho
print("\n\033[92m10. Exportando Configuração do Cluster do Rascunho...\033[0m")
print(f"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)
data = vars(draft_config).copy()
# analisar dados 'Config' para dicionário
if isinstance(data.get("config"), str):
try:
data["config"] = json.loads(data["config"])
except Exception:
pass # Deixar como está se não for JSON válido
with open("config_new.json", "w") as f:
json.dump(data, f, indent=2)
# Carregar o arquivo JSON em um objeto Python
with open("config.json", "r") as f:
config_obj = json.load(f)
# Converter o objeto Python de volta para uma string JSON
# config_json_string = json.dumps(config_obj["config"], indent=2)
# Atualizar o Rascunho de Configuração com novas configurações
print("\n\033[92m11. Atualizando o Rascunho de Configuração com novas configurações ...\033[0m")
print(f"POST /esx/settings/clusters/:cluster/configuration/drafts/{{draft}}?action=update ")
draft_spec = draft_service.UpdateSpec(expected_revision=None, config=config_json_string)
updated_draft = draft_service.update(cluster="domain-c10", draft=draft_id, spec=draft_spec)
# Executar Pré-verificação do Rascunho
print("\n\033[92m12. Executando Pré-verificação do Rascunho ...\033[0m")
precheck_task = draft_service.precheck_task(cluster="domain-c10", draft=draft_id)
print(f"POST /esx/settings/clusters/:cluster/configuration/drafts/{{draft}}?action=precheck&vmw-task=true")
print(f"\033[92mPré-verificação do Rascunho iniciada com sucesso. ID da Tarefa VMware: \033[0m {precheck_task.task_id}")
# Aplicar o Rascunho de Configuração
time.sleep(120)
print("\n\033[92m13. Aplicando o Rascunho de Configuração ...\033[0m")
print(f"POST /esx/settings/clusters/:cluster/configuration/drafts/{{draft}}?action=apply")
apply_task = draft_service.apply(cluster="domain-c10", draft=draft_id)
print(f"\033[92mRascunho de Configuração aplicado com sucesso. ID da Tarefa VMware: \033[0m {apply_task}")
```](streamdown:incomplete-link)
Precisa de ajuda com suas soluções de TI?
A VirtuAllIT Solutions oferece consultoria especializada em virtualização, cloud computing e infraestrutura tecnológica.

