Kuddel071089 9 Geschrieben 23. Januar 2018 Melden Teilen Geschrieben 23. Januar 2018 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 :-) Zitieren Link zu diesem Kommentar
mwiederkehr 373 Geschrieben 23. Januar 2018 Melden Teilen Geschrieben 23. Januar 2018 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""" Zitieren Link zu diesem Kommentar
Kuddel071089 9 Geschrieben 23. Januar 2018 Autor Melden Teilen Geschrieben 23. Januar 2018 ich habe es jetzt wie folgt versucht: $data = """name"":""$servername"", ""type"":""VM"", ""label"":""$funktion""" Leider ist in der Datenbank kein neuer Eintrag zu finden... Zitieren Link zu diesem Kommentar
mwiederkehr 373 Geschrieben 23. Januar 2018 Melden Teilen Geschrieben 23. Januar 2018 Das ist auch kein JSON mehr. 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)""}}" Zitieren Link zu diesem Kommentar
Kuddel071089 9 Geschrieben 23. Januar 2018 Autor Melden Teilen Geschrieben 23. Januar 2018 Habe es zum test ein wenig gekürzt: $data="{""name"":""$servername"",""type"":""VM"",""label"":""$funktion""}}" Leider funktioniert es so auch nicht.... Zitieren Link zu diesem Kommentar
mwiederkehr 373 Geschrieben 23. Januar 2018 Melden Teilen Geschrieben 23. Januar 2018 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. Zitieren Link zu diesem Kommentar
Kuddel071089 9 Geschrieben 23. Januar 2018 Autor Melden Teilen Geschrieben 23. Januar 2018 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 Zitieren Link zu diesem Kommentar
Kuddel071089 9 Geschrieben 23. Januar 2018 Autor Melden Teilen Geschrieben 23. Januar 2018 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 Zitieren Link zu diesem Kommentar
mwiederkehr 373 Geschrieben 23. Januar 2018 Melden Teilen Geschrieben 23. Januar 2018 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. Zitieren Link zu diesem Kommentar
Kuddel071089 9 Geschrieben 23. Januar 2018 Autor Melden Teilen Geschrieben 23. Januar 2018 Naja wenn man alles in einem Befehl absendet wie ganz oben, nur halt ohne Variablen geht es ja auch Zitieren Link zu diesem Kommentar
MurdocX 933 Geschrieben 23. Januar 2018 Melden Teilen Geschrieben 23. Januar 2018 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 1 Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.