Mit vRealize Orchestrator vDisk IOPS Limits setzen

Bereits in meinem Vorherigen Artikel zum Ubuntu 16.04 Provisioning ist ein vRealize Orchestrator Workflow aufgetaucht, welcher VM vDisk IOPS Limits im vCenter setzt.
Auf diesen möchte ich hier noch einmal etwas näher eingehen.

Hintergrund ist wiederum ein Thema, welches ich in dem Artikel zum Reporten und Setzen von Disk IOPs Limits begonnen habe. In dem vorherigen Artikel und Script ist das allerdings erst einmal ein nachgelagerter Prozess gewesen, dies ist natürlich suboptimal. Besser wäre es diese Limits direkt beim Bereitstellen der VM zu setzen.

Da zum Bereitstellen von VMs in meiner Umgebung der VMware vRealize Orchestrator in Verbindung mit VMware vRealize Automation zum Einsatz kommt muss dieser Prozesse in einem vRealize Orchestrator Workflow abgebildet werden.

Der Workflow zum setzen der vDisk IOPS Limits

Haupt Workflow

Hier werden die vorhanden VM Disks mit ihren Klassen reportet und dann die Optionen für das eigentlich Setzen vorbereitet.

vDisk IOPS Limits Workflow Global

Disk Report mit Klassen

An dieser Stelle müssen nun die Datastores klassifiziert und damit den vDisks die Limits zugeordnet werden.

Ein Beispiel:

vDisk Datastore Name: XX01XXX-C01-sla1-S-DS001
Storage Klasse: Silber Klasse (-S-)
IOPS Limit: 1000 IOPS

vDisk IOPS Limits Workflow Script Report

System.debug ("Processing all Disks from Disk Layout for informational purpose...");
for each (var Disk in Disks) {
	var DiskLabel = Disk.deviceInfo.label;
	System.log ("Disk Label: " + DiskLabel);
	var DiskNumber = DiskLabel.slice(-1);
	System.log ("Disk Number: " + DiskNumber);
	var DatastoreName = Disk.backing.datastore.name;
	System.log ("Disk Summary: " + DatastoreName);
	var DatastoreNameSplit = DatastoreName.split("-");
	var DiskClass = DatastoreNameSplit[3];
	System.log ("Disk Class: " + DiskClass);
	switch (DiskClass) {
		case "S" :
			var DiskIOLimit = "1000";
			break;
		case "B" :
			var DiskIOLimit = "250";
			break;
		case "G" :
			var DiskIOLimit = "-1";
			break;
     	default:
        	var DiskIOLimit = "-1";   
		}
	System.log ("Disk IO Limit: " + DiskIOLimit);
	}

	

 

Aufbereitung der Optionen für vDisk IOPS Limits

vDisk IOPS Limits Workflow Script Set

System.debug ("Processing all Disks from Disk Layout in loop: " + DiskLoop);
for each (var Disk in Disks) {
	var DiskLabel = Disk.deviceInfo.label
	var DiskNumber = DiskLabel.slice(-1);
	if (DiskNumber == (DiskLoop +1) ) {
		var DisktoProcess = DiskLabel;
		System.log ("Found Disk!"); 
		var DatastoreName = Disk.backing.datastore.name;
		System.log ("	Disk Name: " + DatastoreName);
		var DatastoreNameSplit = DatastoreName.split("-");
		var DiskClass = DatastoreNameSplit[3];
		System.log ("	Disk Class: " + DiskClass);
		switch (DiskClass) {
			case "S" :
				var DiskIOLimit = "1000";
				break;
			case "B" :
				var DiskIOLimit = "250";
				break;
			case "G" :
				var DiskIOLimit = "-1";
				break;
     		default:
      	  	var DiskIOLimit = "-1";   
			}
		}
	}

System.log ("	Disk to Process: " + DisktoProcess);
System.log ("	Disk IO Limit: " + DiskIOLimit);

 

Sub Workflow

Hier wird die eigentliche Anpassung an den vDisk Optionen durchgeführt.

vDisk IOPS Limits Workflow Set

Task zur Neukonfiguration Vorbereiten

vDisk IOPS Limits vCO Disk Options

//William Lam - Base
//Markus Kraus - removed Shares 

var devices = vm.config.hardware.device;
var diskName = disk

System.log("Searching for " + diskName);
for ( device in devices )  {
	if (devices[device] instanceof VcVirtualDisk && devices[device].deviceInfo.label == diskName) {
			System.log("Found " + diskName);
			
			var storageIO = new VcStorageIOAllocationInfo();

			//set disk IO limits
			System.log("Setting Disk IO Limit to " + limit);
			storageIO.limit = limit;	
				
			var diskSpec = new VcVirtualDisk()
			diskSpec.controllerKey = devices[device].controllerKey;
			diskSpec.unitNumber = devices[device].unitNumber;
			diskSpec.key = devices[device].key;
			diskSpec.backing = devices[device].backing;
			diskSpec.deviceInfo = devices[device].deviceInfo;
			diskSpec.capacityInKB = devices[device].capacityInKB;
			diskSpec.storageIOAllocation = storageIO;
			
			var devspec = new VcVirtualDeviceConfigSpec();
			devspec.operation = VcVirtualDeviceConfigSpecOperation.edit;
			devspec.device = diskSpec;
			
			//created device change spec
			var vmspec = new VcVirtualMachineConfigSpec();
			var deviceSpec = [];
			deviceSpec[0] = devspec;
			vmspec.deviceChange = deviceSpec;
			break;
	}
}

//reconfigure VM
System.log("Reconfiguring Virtual Machine: " + vm.name + " ...");
task = vm.reconfigVM_Task(vmspec);

 

Workflow Logs

vDisk IOPS Limits Workflow Log

Download

Download Workflow

 

 

Special Thanks

William Lam hat einen sehr guten vRO Workflow für das setzen der vDisk Optionen in der VMware Community veröffentlicht:
Configure VM Disk Shares & IOPS Limit vCO Workflow

Und auch einen Blog Artikel dazu veröffentlicht:
Configure Virtual Machine Disk Shares & IOP Limits Using vCO Workflow

Den Workflow habe ich für meinen Zweck noch um das Setzen von Shares reduziert und ein Problem mit Sprachdifferenzen gelöst.

im Deutschen vCenter wird per API eine vDisk als Festplatte und nicht als HardDisk  bezeichnet


In der von mir veröffentlichten Version ist der Workflow nun Multilanguage.

Leave a Reply