pascalm24
Enthusiast
Enthusiast

Custom Attribute in VSphere mit PowerCLI exportieren/importieren

Jump to solution

Hallo Zusammen

Wir wollen unsere Serverattribute mit PowerCLI exportieren, anpassen und wieder einlsesen. Für den Export habe ich folgenden Befehl verwendet:

Get-VM | select Name, Description, Stakeholder | Export-Csv -path “c:\vminventory.csv” -NoTypeInformation

Der Export funktionierte ganz gut jedoch habe ich keine Einträge bei meinem Custom Attribut "Stakeholder". Das Attribut Stakeholder habe ich mit diesem Befehl hinzugefügt:

New-customattribute -targettype "virtualmachine" -name "stakeholder"

Könnnt ihr mir da weiterhelfen?

1. Richtiger Export für Custom Attribute

2. Import des CSV nach der Anpassung von den Custom Attributen

Vielen Dank schon einmal im Voraus

Grüsse

Pascal M

1 Solution

Accepted Solutions
berndweyand
Expert
Expert

die Zeile 5:

$export="" |select-object vm,Stakeholder,name,value|`

muss so aussehen:

$export="" |select-object vm,Stakeholder,name,value   (also ohne Pipe und Semikolon).

Der Inhalt der Annotation ist jetzt aber doppelt vorhanden - in "stakeholder" und in "value"

Für ein reines Auslesen der Annotations reicht aber :

get-vm | foreach-object {

   $vm =$_

   $vm | get-annotation -customattribute Stakeholder|`

   foreach-object {

      $export="" |select-object vm,name,value

      $export.value=$_.value

      $export.name=$_.name

      $export.vm=$vm.name

      $export   

   }

} | Export-Csv -path “c:\vminventory.csv” -NoTypeInformation

Erklärung:

$vm.* bezieht sich auf das VM-Object und $_.* auf das Annotation-Object. In $_.name steht die Bezwichnung der Annotation (hier eben nur stakeholder, können ja mehrere sein), in $_.value der Inhalt

View solution in original post

23 Replies
berndweyand
Expert
Expert

damit müsste es gehen (habs nochmal korrigiert):

get-vm | foreach-object {

   $vm =$_

   $vm | get-annotation -customattribute Applikation|`

   foreach-object {

      $export="" | select-object vm,description,Stakeholder

      $export.vm=$vm.name

      $export.powerstate=$vm.description

      $export.Stakeholder=$_.value

   }

}

$export | Export-Csv -path “c:\vminventory.csv” -NoTypeInformation

Import dann nach Änderung mit

Import-Csv -Path c:\vminventory.csv | Where-Object {$_.Value} | ForEach-Object {

Get-VM $_.VM | Set-Annotation -CustomAttribute $_.Name -Value $_.Value

}


pascalm24
Enthusiast
Enthusiast

Hi bewe

Danke für die schnelle Antwort

Das Script hat funktioniert jedoch bekomme ich nur den Output von einer VM. Muss ich für das ganze Cluster noch einen anderen Befehl ins Script nehmen oder habe ich sont ein Fehler im Script?

LG Pascal

0 Kudos
berndweyand
Expert
Expert

ja stimmt - er reported nur die letzte vm.

so geht es- gerade noch getestet:

get-vm | foreach-object {

   $vm =$_

   $vm | get-annotation -customattribute Stakeholder|`

   foreach-object {

      $export="" | select-object vm,description,Stakeholder

      $export.vm=$vm.name

      $export.powerstate=$vm.description

      $export.Stakeholder=$_.value

      $export

   }

} | Export-Csv -path “c:\vminventory.csv” -NoTypeInformation

pascalm24
Enthusiast
Enthusiast

Super der Export hat einwandfrei funktioniert, ich sehe nun alle VMs und ihre Stakeholder. Ich habe auch gleich das CSV File angepasst (bei leeren Felder habe ich Test-Stakeholder eingetragen) nun wollte ich den Import angehen, leider bekomme ich eine Fehlermeldung:

Script:

Fehler:

Kannst du mir da auch weiterhelfen

0 Kudos
berndweyand
Expert
Expert

bitte mit Fehlermeldung 😉

pascalm24
Enthusiast
Enthusiast

Oh sry mein Fehler dachte der Screenshot ist drin... heir nochmals

Befehl:

Fehler:

pastedImage_2.png

Hier nochmals beides falls die Screenshots nicht funktionieren

befehl_fehler.png

0 Kudos
berndweyand
Expert
Expert

ich hatte natürliche andere Annotations bei mir getestet weil es bei mir keinen stakeholder gibt. Eintragen will ich ihn nicht weil man das nicht mehr löschen kann.

Diese Kombination sollte jetzt laufen - aber bitte vorher nochmal einen Export machen und die Datei nochmal bearbeiten!

get-vm | foreach-object {

   $vm =$_

   $vm | get-annotation -customattribute Stakeholder|`

   foreach-object {

      $export="" |select-object vm,description,name,value

      $export.vm=$vm.name

      $export.description=$vm.description

      $export.name=$_.name

      $export.value=$_.value

      $export    

   }

} | Export-Csv -path “c:\vminventory.csv” -NoTypeInformation

Import-Csv -Path .\test.csv | Where-Object {$_.value} | ForEach-Object {

    Get-VM $_.VM | Set-Annotation -CustomAttribute $_.Name -Value $_.value

}

pascalm24
Enthusiast
Enthusiast

Hallo bewe

Ich habe das Skript ausporbiert jedoch bekomme ich eine Fehler bei der Foreach Schleife (siehe Bild unten)

Skript:

Fehler:

pastedImage_0.png

Ich habe den Fehler gegooglet und man bekommt ihn wen man einen eigenstädnigen Block von Code in einer Pipline ausführt, nur was heisst das jetzt und wie kann ich es beheben?

Könnt ihr mir weiterhelfen?

LG Pascal

0 Kudos
berndweyand
Expert
Expert

also die scripte im letzten Post habe ich bei mir ohne Probleme laufen lassen.

Aber ohne Fehlermeldung kann ich da nicht helfen 😉

pascalm24
Enthusiast
Enthusiast

Sorry weiss echt nicht woran es liegt ich sehe die Bilder immer wenn ich sie poste Smiley Wink . So 2. Versuch

LG Pascal

0 Kudos
pascalm24
Enthusiast
Enthusiast

Hat wieder nicht geklappt. Oh man 3. Verusch

2020-09-28 12_51_13-10.245.176.67 - Remote Desktop Connection - __Remote.png

0 Kudos
berndweyand
Expert
Expert

die Zeile 5:

$export="" |select-object vm,Stakeholder,name,value|`

muss so aussehen:

$export="" |select-object vm,Stakeholder,name,value   (also ohne Pipe und Semikolon).

Der Inhalt der Annotation ist jetzt aber doppelt vorhanden - in "stakeholder" und in "value"

Für ein reines Auslesen der Annotations reicht aber :

get-vm | foreach-object {

   $vm =$_

   $vm | get-annotation -customattribute Stakeholder|`

   foreach-object {

      $export="" |select-object vm,name,value

      $export.value=$_.value

      $export.name=$_.name

      $export.vm=$vm.name

      $export   

   }

} | Export-Csv -path “c:\vminventory.csv” -NoTypeInformation

Erklärung:

$vm.* bezieht sich auf das VM-Object und $_.* auf das Annotation-Object. In $_.name steht die Bezwichnung der Annotation (hier eben nur stakeholder, können ja mehrere sein), in $_.value der Inhalt

View solution in original post

pascalm24
Enthusiast
Enthusiast

Okay macht Sinn, hat auch funktioniert.

Nur der Import klappt noch nicht wie gewollt. Ich habe nun erfoglreich eine CSV Datei generiert mit den Namen der VM und Stakeholder, danach habe ich die DAtei angepasst, also Stakeholder hinzugefügt und abgeändert und es mit dem Importbefehl einzulesen versucht. Der Import gibt keinen Fehler aus und läuft ohne Probleme durch, nur leider wird auch kein Attribut angepasst.

import.png

0 Kudos
berndweyand
Expert
Expert

in der CSV sind dann auch alle 3 Spalten (vm, name, value) mit Werten hinterlegt ?

pascalm24
Enthusiast
Enthusiast

Hatte einen Fehler im Export CSV nun klappt es. Sehe sogar welche Attribute abgeändert wurden. Danke dir viel mal

0 Kudos
berndweyand
Expert
Expert

gerne 🙂

0 Kudos
pascalm24
Enthusiast
Enthusiast

Ich habe noch ein paar Fragen Smiley Wink

(fyi)

Ich habe das erste mal mit PowerCLi gearbeitet und bewegte mich daher nur in der Testumgebung herum, nun muss ich es im Live implementieren. PowerCLI war schon installiert (in der Testumgebung habe ich es selbst installiert)

Problem 1:

Ich habe mein Skript etwas abgeändert da ich gerne alle CustomAttribute auf einmal ausgeben möchte. Ich habe bei get-annotation, zu Stakeholder auch noch ein anderes vorhandenes Attribut "test" hinzugefügt (siehe unten). Nun sehe ich als Output im CSV File aber immer noch nur Name, VM, Value was etwas unübersichtlich werden kann wenn man 15 Custom Attributes hat.

Nun meine Frage; Kann ich das CSV File etwas übersichtlicher gestalten das man zu Oberst Name der VM, Customattribut 1, Customattribut 2 etc sehen kann und unten dann die Werte dazu?

Kann man alle Customattribute auf einmal ausgeben (für alle VMs)?

Problem 2:

Nun im Live System funktioniert das Skript nicht mehr wie gewollt. Ich bewege mich in der PowerCLI Konsole (Connect-VIServer hat funktioniert) und habe mich mit cd zu meinem Skript verschoben. Nun beim ausführen des Skripts passiert einfach nix... keine Fehlermeldung und kein generiertes CSV File... Liegt es am Skript habe ich einen Tippfehler der sonstige Probleme?

Skript:

Get-VM | foreach-object {

$vm=$_

$vm | get-annotation -customattribute Stakeholder, Test|`

foreach-object {

$export=""| select-object vm,name,value

$export.value=$_.value

$export.name=$_.name

$export.vm=$vm.name

$export

}

} | Export-Csv -path "C:\powercli\dump\export\dump.csv" -NoTypeInformation

Hier der Versuch bei PowerCLI

fehler1.png

Hier der 2. Versuch im normalen Powershell ISE Fenster

fehler2.png

ah btw ich habe auch Versucht ein neues CustomAttribute (Policy) per Konsole zu erstellen und das hat funktioniert

policy.png

Hoffe man sieht die Bilder 😉

LG Pascal

0 Kudos
berndweyand
Expert
Expert

zu Problem 1: ja kann man. das bedeutet aber innerhalb der zweiten foreach-Schleife Programmieraufwand der dann auch beim Import angewendet werden muss.

zu Problem 2: ich vermute mal mangelnde Rechte im Ordner um die csv zu schreiben? Das Script sieht ok aus. Lass einfach mal in der letzten Zeile nur das } stehen, also Pipe und Export löschen, dann wird alles auf die Console geschrieben.

Es handelt sich offentlichlich um PowerCLi maximal Version 6.5 wie man sieht - die funktioniert in der ISE nicht automatisch und kennt demnach den Befehl get-vm nicht. man müsste erstmal mit "Import-Module vmware......" die Module nachladen. Würde aber empfehlen auf die neueste Version upzudaten - wir sind mittlerweile bei Version 12.0. Die gibts aber nicht mehr als installierbare Datei sondern wird aus der Powershell-Gallery installiert. Die alte Version deinstallieren, dann powershell öffnen und "Install-Module -Name VMware.PowerCLI" starten

0 Kudos
pascalm24
Enthusiast
Enthusiast

Okay muss mir ma die Versionen anschauen und wenn nötig dann updaten/neuinstallieren, aber in der PowerCLI Konsole sollte es ja gehen

Ich habe wie du vorgeschlagen hast den letzten Part des Skripts gelöscht es sieht nun so aus:

Get-VM | foreach-object {

$vm=$_

$vm | get-annotation -customattribute Stakeholder|`

foreach-object {

$export=""| select-object vm,name,value

$export.value=$_.value

$export.name=$_.name

$export.vm=$vm.name

$export

}

Ich bekomme leider immer noch keine Fehlermeldung:

2try.png

Stimmt mein Skript so?

0 Kudos