Este site utiliza cookies

Utilizamos cookies para melhorar sua experiência de navegação, personalizar conteúdo e analisar nosso tráfego. Ao clicar em 'Aceitar', você concorda com o uso de cookies conforme nossa Política de Privacidade.

Virtualização

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

VMware
19 de fevereiro de 2026
10 min de leitura
Compartilhar:
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

O Comando de Descoberta:

powershell
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.

powershell
#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

A Implementação em Python:

Para invocar isso, você usa a classe de serviço Transition encontrada dentro do módulo enablement.configuration_client.

  1. Importar a Classe de Serviço Primeiro, importe a classe Transition do módulo cliente apropriado:

    python
    from com.vmware.esx.settings.clusters.enablement.configuration_client import Transition
    
  2. Inicializar o Endpoint de Serviço Uma vez importado, você cria um endpoint de serviço passando sua configuração de stub vsphere_client autenticada 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}")
    

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.

python
"""
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.