Başlangıç > VMware > 223: vCenter 6.5 ile REST’leşmek

223: vCenter 6.5 ile REST’leşmek

restapi0Bu hafta içerisinde, vCenter 6.5’in REST desteğinden ve API Explorer arayüzünden bahsetmiştim (buradan erişebilirsiniz). Teorik olarak üzerinden geçtikten sonra sıra, en temel bir iki fonksiyonu, REST API ile nasıl gerçekleştirebileceğimizi görmeye geldi.

Öncelikle bu iş için her hangi bir eklentiye, modüle ve hatta PowerCLI’a bile ihtiyacımız yok. Web talebi gönderebileceğimiz her türlü programlama dili veya ortamı kullanabiliriz, bu C#, perl, phyton, powershell, standard bir tarayıcı, hatta IoT destekli buzdolabımız bile olabilir. Zaten REST API’ların bir gücü de buradan gelmiyor mu?

Burada powershell’i tercih ettim, daha aşina olduğum bir yapı olduğundan dolayı. Powershell içerisinde, bu amaç uğruna anlam ifade edebilecek iki adet komut var; Invoke-WebRequest ve Invoke-RestMethod.  Neredeyse aynı parametreleri alıp, aynı işi gerçekleştiren bu iki komut arasında en temel fark, ürettiği çıktılar. WebRequest ile aldığımız cevap HtmlWebResponseObject objesi olacaktır ve içerisinde content bilgisini manuel olarak parse etmemiz gerekecektir. RestMethod komutunun çıktısı ise content’in tipine göre değişebilir ve JSON olduğu durumda, çok daha kolay parse edilebilir bir PSObject objesi dönecektir.

Powershell üzerinden web taleplerimizi nasıl şekillendirmemiz gerektiği konusunda desteği de API Explorer üzerinden edinebiliriz. vCenter session tabanlı bir yapıya sahip olduğundan dolayı öncelikle doğru kimlik bilgileri ile bir session açmamız gerekmektedir (PowerCLI ile yaptığımız Connect-VIServer komutu benzeri). Bu amaç uğruna kullanabileceğimiz API çağrısı aşağıdaki gibidir;

restcalls1

Buradan bir POST komutu ve vmware-use-header-authn isimli bir parametre göndermemiz gerektiğini görebiliyoruz. Eğer “TRY IT OUT” düğmesine tıklarsak da, hem örnek curl komutunu hem de geri dönen cevabı görebiliriz. Bu bilgiler de gerçekleştireceğimiz çağrıları daha doğru şekillendirmemizi sağlayacaktır. Benim senaryomda örnek çıktı aşağıdaki şekilde gerçekleşti.

restcall2

Burada dikkat etmemiz gereken en önemli nokta dönen “session ID” bilgisi. REST stateless bir yapıda olduğundan dolayı session bilgilerini tutmayacaktır. Dolayısı ile bu ID’yi bir parametreye atayıp, sonraki tüm çağrılarımızda header olarak göndermemiz gerekecektir aksi taktirde diğer çağrılarda “This method requires authentication” hatası alırız.

Bir diğer önemli nokta da, bu ID’nin güvenliği. Unutmayalım ki, bu ID ile birlikte, isteyen her kullanıcı her türlü şekilde, bizim yetkilerimizle işlem yapabilir. Bunun bilincinde olmak önemli.

Bu işlemi eğer bir fonksiyona çevirmek istesek, aşağıdakine benzer bir kod bloğu oluşacaktır.


function Connect-REST_VIServer {
param ( [Parameter(Mandatory=$true)][String]$VIServer,
[Parameter(Mandatory=$true)][String]$userName,
[Parameter(Mandatory=$true)][String]$userPass )

$secPass = ConvertTo-SecureString $userPass -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ($userName, $secPass)
$Global:DefaultApiURL = ("https://{0}/rest" -f $VIServer)
$ApiURL = ("{0}/com/vmware/cis/session" -f $Global:DefaultApiURL)
$headers = @{
"Content-Type"="application/json";
"Accept"="application/json";
"vmware-use-header-authn"="TestValue2" }
$response = Invoke-RestMethod -Uri $ApiURL -Method Post -Credential $cred -Headers $headers
$sessionID = $response.value
return $sessionID
}

Artık bir session ID’sine sahip olduğumuzdan dolayı, diğer temel işlemleri gerçekleştirebiliriz. Örnek olarak, filtre kullanarak bir VM’i çağırmak.


function Get-REST_VM {
param ( [Parameter(Mandatory=$true)][String]$vmName,
[Parameter(Mandatory=$true)][String]$sessionID )

$ApiURL = ("{0}/vcenter/vm" -f $Global:DefaultApiURL)
$headers = @{
"Content-Type"="application/json";
"Accept"="application/json";
"vmware-api-session-id"=$sessionID }
$body = @{"filter.names"=$vmName}
$response = Invoke-RestMethod -Uri $ApiURL -Method Get -Headers $headers -Body $body
$vmID = $response.value.vm
return $vmID
}

Görüldüğü üzere, burada header bilgisi olarak daha önce edindiğim session ID’sini (vmware-api-session-id) göndermem yetiyor. Aynı zamanda body parametresi içerisinde de filtremi belirttim. Eğer bir filtre kullanmasaydım, tüm VM’leri listeleyecekti. Hangi filtrelerin kullanılabileceği yine API Explorer üzerinden görülebilmektedir. Return objesi olarak da vmID dönmek uygun çünkü bir sonraki fonksiyona input parametresi olarak bunu verebileceğiz. Yani kapalı bir sanal sunucuyu başlatmak.


function Start-REST_VM {
param ( [Parameter(Mandatory=$true)][String]$vmID,
[Parameter(Mandatory=$true)][String]$sessionID )

$ApiURL = ("{0}/vcenter/vm/{1}/power/start" -f $Global:DefaultApiURL, $vmID)
$headers = @{
"Content-Type"="application/json";
"Accept"="application/json";
"vmware-api-session-id"=$sessionID }
$response = Invoke-RestMethod -Uri $ApiURL -Method Post -Headers $headers
}

Tüm operasyonlarımızı tamamladıktan sonra, elbette yapmamız gereken son aksiyon, açmış olduğumuz seansı sıfırlamak. Bunun için bir DELETE metodu kullanıyoruz.


function Disconnect-REST_VIServer {
param ( [Parameter(Mandatory=$true)][String]$sessionID )

$ApiURL = ("{0}/com/vmware/cis/session" -f $Global:DefaultApiURL)
$headers = @{
"Content-Type"="application/json";
"Accept"="application/json";
"vmware-api-session-id"=$sessionID }
$response = Invoke-RestMethod -Uri $ApiURL -Method Delete -Headers $headers
$Global:DefaultApiURL = $null
}

Bu birkaç basit fonksiyon, REST API’lar, kullanımı ve gücü ile ilgili umarım az da olsa fikir verebilmiştir.

Kategoriler:VMware Etiketler:
  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: