Jump to content

Empfohlene Beiträge

Hallo zusammen,

 

wir verwalten alle unsere Server in einer zentralen Datenbank, in RackTables.

 

Da wir unsere VMs per PS Skript ausrollen, wollte ich die Erstellung eines neuen DB-Eintrages in das Ausroll-Skript einfügen.

 

Leider scheitere ich gerade bei der Übergabe der im Skript verwendeten Variablen.

 

Also mit Strings geht es:


cls
$apiUser="be28f0a29e7df3b9a455871abdb25d2a"
$apiPass="a8b15299dbbc374a05c7b8068001b634"
$res="http://serverdoku.*****.local:9292/object"

 

$apiHash = ConvertTo-SecureString $apiPass -AsPlainText -Force
$apiCred = New-Object Management.Automation.PSCredential ($apiUser, $apiHash)

 

$data='{"name":"Test-Server","type":"VM","label":"TEST","attributes":{"Ansprechpartner":"Admin","ESX-Cluster":"Standard","CPU-Anzahl":"8","Betriebssystem":"Windows%GPASS%Server 2012 R2 64-Bit","ServiceRequest":"REQ-2018-12345","KST":"911 (RZ-Infrastruktur)"}}'

try {
Invoke-WebRequest -Uri $res -Credential $apiCred -Method Post -Body $data -ContentType "application/json" -TimeoutSec 10
}
catch  {}

 

Jetzt würde ich gerne Servernamen etc. durch Variablen ersetzen.


Sprich:


$data='{"name":"$servername","type":"VM","label":"$funktion","attributes":{"Ansprechpartner":"$verantwortlicher","ESX-Cluster":"Standard","CPU-Anzahl":"8","Betriebssystem":"$os,"ServiceRequest":"REQ-$jahr-$request","KST":"$kst)"}}'

 

Da ich auf dem Gebit noch keine Ahnung habe, weiß ich jetzt nicht genau, wo die " weg können etc. Die Variablen werden so nämlich nicht erkannt.

 

 

Vielen Dank schon einmal :-)

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Innerhalb von einfachen Anführungszeichen werden Variablen nicht expandiert. Da Du doppelte Anführungszeichen im String brauchst, hast Du zwei Möglichkeiten:

 

- String unterbrechen:

$data = '"server":"' + $server + '"'

- doppelte Anführungszeichen escapen, aus "" wird ":

$data = """server"":""$server"""

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Das ist auch kein JSON mehr. :smile: Mein Beispiel war vielleicht etwas zu spartanisch. So habe ich es eigentlich gemeint (mit geschweiften Klammern):

$data="{""name"":""$servername"",""type"":""VM"",""label"":""$funktion"",""attributes"":{""Ansprechpartner"":""$verantwortlicher"",""ESX-Cluster"":""Standard"",""CPU-Anzahl"":""8"",""Betriebssystem"":""$os,""ServiceRequest"":""REQ-$jahr-$request"",""KST"":""$kst)""}}"

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Da Variablen werden korrekt expandiert. Du hast aber hinten eine schliessende Klammer zu viel. Wenn es auch nach Korrektur nicht geht, solltest Du mal schauen, was der Server sagt, also

$req = Invoke-WebRequest ...
$req.Content

(oder allenfalls $req.RawContent)

 

Falls das Problem nicht die PowerShell ist, sondern die Anfragen anders zusammengestellt werden müssen, kann https://www.getpostman.com/ helfen. Damit kann man solche Requests zusammenstellen, abschicken und die Antwort lesen. Ist zum Debuggen etwas komfortabler als direkt mit der PowerShell.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
vor 14 Minuten schrieb mwiederkehr:

Da Variablen werden korrekt expandiert. Du hast aber hinten eine schliessende Klammer zu viel. Wenn es auch nach Korrektur nicht geht, solltest Du mal schauen, was der Server sagt, also


$req = Invoke-WebRequest ...
$req.Content

(oder allenfalls $req.RawContent)

 

Falls das Problem nicht die PowerShell ist, sondern die Anfragen anders zusammengestellt werden müssen, kann https://www.getpostman.com/ helfen. Damit kann man solche Requests zusammenstellen, abschicken und die Antwort lesen. Ist zum Debuggen etwas komfortabler als direkt mit der PowerShell.

Habe die Klammer entfernt... Zack ist der Eintrag da. Dann werde ich jetzt mal versuchen alle vorhandenen Infos in die Datenbank zu schreiben.

Vielen Dank bis hier her

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Aktueller Stand:

 

Habe zum Test versucht das erste Attribut zu posten. Leider ohne erfolgt:


$data="{""name"":""$servername"",""type"":""VM"",""label"":""$funktion"",""attributes"":{""Ansprechparnter"":""$verntwortlicher""}}"

 

Ausgabe in der ISE


StatusCode        : 200
StatusDescription : OK
Content           : {}
RawContent        : HTTP/1.1 200 OK
                    Connection: Keep-Alive
                    Content-Length: 0
                    Date: Tue, 23 Jan 2018 09:08:03 GMT
                    Server: WEBrick/1.3.1 (Ruby/2.1.6/2015-04-13)
                    
                    
Headers           : {[Connection, Keep-Alive], [Content-Length, 0], [Date, Tue, 23 Jan 2018 09:08:03 GMT], [Server, WEBrick/1.3.1 (Ruby/2.1.6/2015-04-13)]}
RawContentLength  : 0

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Dann wird das Problem bei RackTables liegen, bzw. die Ansteuerung ist falsch. Kann man Attribute setzen, indem man ein neues Objekt schickt? Oder muss man das Objekt zuerst erstellen (was ja funktioniert hat) und die Attribute dann separat setzen, mit der ID des Objekts als Parameter? Kenne RackTables nicht, aber bei einer Datenbank macht man ja auch erst ein INSERT und Änderungen dann über die ID, nicht indem man den ganzen Datensatz noch einmal schickt.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Um das ganze übersichtlichere und dadurch auch fehlerfreier zu gestallten, würde ich es so lösen:

 

$objJson = New-Object -TypeName PsCustomObject -ArgumentList @{
    name = $servername
    type = "VM"
    label = $funktion
    attributes = New-Object -TypeName PsCustomObject -ArgumentList @{ Ansprechparnter = $verntwortlicher }
 }

$strJsonRequest = $objJson | ConvertTo-Json -Compress
$ServerUri = "www.blabla.de"
 
Invoke-WebRequest -Method Post -Uri $ServerUri -Body $strJsonRequest

 

  • Like 1

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden

×