[英]Groovy: Executing azure CLI Command with JSON - Parsing Issue?
當前,由於命令中的JSON部分,我無法從Groovy運行azure CLI命令。
有一個azure命令可在虛擬機上運行自定義腳本。 計算機上的CommandToExecute以JSON形式傳遞。
工作示例:
REQUEST-CALL in Console:az vm extension set -g demo --vm-name demo-cfg01 --name CustomScript --publisher Microsoft.Azure.Extensions --settings '{"commandToExecute":"ls"}'
RESPONSE: {
"autoUpgradeMinorVersion": true,
"forceUpdateTag": null,
"id": "/subscriptions/xxxxxxxxxx-xxxxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/demo/providers/Microsoft.Compute/virtualMachines/demo-cfg01/extensions/CustomScript",
"instanceView": null,
"location": "germanycentral",
"name": "CustomScript",
"protectedSettings": null,
"provisioningState": "Succeeded",
"publisher": "Microsoft.Azure.Extensions",
"resourceGroup": "demo",
"settings": {
"commandToExecute": "ls"
},
"tags": null,
"type": "Microsoft.Compute/virtualMachines/extensions",
"typeHandlerVersion": "2.0",
"virtualMachineExtensionType": "CustomScript"
}
這個腳本工作正常。
用Groovy執行的“相同”命令導致以下結果:
def process
StopWatch.withTimeRecording("EXECUTING COMMAND '" + cargs + "'",_logger, Level.ALL) {
process = (cargs).execute(null,null);
process.waitForProcessOutput(sout, serr)
}
請注意StopWatch記錄包含參數的StringArray:
執行命令'[az,vm,extension,set,-g,demo,--vm-name,demo-cfg01,--name,CustomScript,--publisher,Microsoft.Azure.Extensions,--settings,'{“ commandToExecute“:” ls“}']'
Params與控制台中的外觀相同
來自Azure的響應是:
VM已報告處理擴展名'CustomScript'時失敗。 錯誤消息:“啟用失敗:無法獲取配置:錯誤讀取擴展配置:錯誤解析設置文件:錯誤解析json:json:無法將字符串解組為map [string] interface {類型的Go值
我認為groovy在執行之前會以某種方式轉義字符,我無法弄清楚出了什么問題。 有什么建議嗎?
當您在groovy array
上調用execute
(實際上是java)時,將每個參數雙引號引起來。
只需根據需要在命令行中構建命令行
groovy中的字符串具有與數組相同的execute方法...
def cmd = """az vm extension set -g demo --vm-name demo-cfg01 --name CustomScript --publisher Microsoft.Azure.Extensions --settings '{"commandToExecute":"ls"}' """
def process = cmd.execute()
當您對字符串groovy使用execute時,將執行您提供的確切命令
找到了“解決方法”。 az命令還接受* .json文件作為設置參數。 為此,我首先在一個臨時json文件中創建命令,並將json文件作為參數傳遞。 作品!
您引用一個.execute()
調用。 您無需在那里引用,因為此處不涉及任何shell或命令解析器。
您的命令在那里得到'{"commandToExecute":"ls"}'
,這是有效的JSON 字符串 (無Map),這也是錯誤消息指出的內容:
解析json時出錯:json:無法將字符串解組為map [string] interface類型的Go值
只需在{"commandToExecute": "ls"}
使用{"commandToExecute": "ls"}
(不包含'
)作為參數即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.