簡體   English   中英

Groovy:使用JSON執行azure CLI命令-分析問題?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM