AI智能
改变未来

【Azure Developer】调用SDK的runPowerShellScript方法,在Azure VM中执行PowerShell脚本示例

当需要通过代码的方式执行PowerShell脚本时,可以参考以下的示例。

Azure SDK中提供了两个方法来执行PowerShell脚本 (SDK Source Code: https://github.com/Azure/azure-libraries-for-java/blob/master/azure-mgmt-compute/src/main/java/com/microsoft/azure/management/compute/implementation/VirtualMachineImpl.java#L400)

  • public RunCommandResult runPowerShellScript(String groupName, String name, List<String> scriptLines, List<RunCommandInputParameter> scriptParameters)
  • public Observable<RunCommandResult> runPowerShellScriptAsync(List<String> scriptLines, List<RunCommandInputParameter> scriptParameters)

在使用的时候,需要注意的是参数scriptLines 和 scriptParameters。 下面部分为关键代码,以Java SDK的同步方法runPowerShellScript为例

Azure azure = null;azure = Azure.authenticate(credentials).withSubscription(\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\");// 获取虚拟机对象VirtualMachine testvm = azure.virtualMachines().getById(\"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/vm resource group /providers/Microsoft.Compute/virtualMachines/vm name\");//testvm.start();// 准备PowerShell脚本List<String> scriptLines = new ArrayList<String>();scriptLines.add(\" param([string]$arg1, [string]$arg2 )\");scriptLines.add(\" Write-Host This is a sample script with parameters $arg1 and $arg2\");scriptLines.add(\" Get-Host | Select-Object Version\");//设置参数arg1 和 arg2List<RunCommandInputParameter> scriptParameters = new ArrayList<RunCommandInputParameter>();RunCommandInputParameter arg1 = new RunCommandInputParameter(){};arg1.withName(\"arg1\");arg1.withValue(\"test1\");RunCommandInputParameter arg2 = new RunCommandInputParameter(){};arg2.withName(\"arg2\");arg2.withValue(\"test2\");scriptParameters.add(arg1);scriptParameters.add(arg2);//执行 PowerShellRunCommandResult rcresult = testvm.runPowerShellScript(\"vm-rg\", \"lbpstest01\", scriptLines, scriptParameters);System.out.println(rcresult.value().get(0).message());System.out.println(rcresult.value().get(1).message());

注意:

  1. 在获取 azure对象时,需要通过AAD认证。并且当前使用的认证有权限操作所选择的虚拟机(VM)。获取认证信息部分参考博文 “使用Java代码启动Azure VM(虚拟机)”
  2. 如PowerShell脚本中需要传入参数,则必须在脚本中进行声明,如:param([string]$arg1, [string]$arg2 ),然后通过scriptParameters对象传入。
  3. PowerShell执行成功的结果包含在RunCommandResult对象的Value 1中,如果所输入的PowerShell脚本有语法等操作,则在Value 2中输出详细的异常消息.

在执行PowerShell脚本时,如发现脚本有错误。在RunCommandResult中会返回PowerShell提示的错误信息:

错误的PowerShell脚本
RunCommandResult中的提示消息

示例完整代码:

package org.example;import java.util.ArrayList;import java.util.List;import com.microsoft.azure.AzureEnvironment;import com.microsoft.azure.credentials.ApplicationTokenCredentials;import com.microsoft.azure.credentials.AzureTokenCredentials;import com.microsoft.azure.management.Azure;import com.microsoft.azure.management.compute.*;/*** s Hello world!**/public class App {public static void main(String[] args){//使用AAD Application 方式获取 认证AzureTokenCredentials credentials = new ApplicationTokenCredentials(\"application id\",\"tenant id \"securt key\",AzureEnvironment.AZURE_CHINA);Azure azure = null;azure = Azure.authenticate(credentials).withSubscription(\"subscription id\");// 获取虚拟机对象VirtualMachine testvm = azure.virtualMachines().getById(\"resource id\");//testvm.start();// 准备PowerShell脚本List<String> scriptLines = new ArrayList<String>();scriptLines.add(\" param([string]$arg1, [string]$arg2)\");scriptLines.add(\" Write-Host This is a sample script with parameters $arg1 and $arg2\");scriptLines.add(\" Get-Host | Select-Object Version\");//设置参数arg1 和 arg2List<RunCommandInputParameter> scriptParameters = new ArrayList<RunCommandInputParameter>();RunCommandInputParameter arg1 = new RunCommandInputParameter(){};arg1.withName(\"arg1\");arg1.withValue(\"test1\");RunCommandInputParameter arg2 = new RunCommandInputParameter(){};arg2.withName(\"arg2\");arg2.withValue(\"test2\");scriptParameters.add(arg1);scriptParameters.add(arg2);//执行 PowerShellRunCommandResult rcresult = testvm.runPowerShellScript(\"vm-rg\", \"lbpstest01\", scriptLines, scriptParameters);System.out.println(rcresult.value().get(0).message());System.out.println(rcresult.value().get(1).message());System.out.println(\"Hello World!\");}}

在POM.XML中引用的SDK Version:

<dependency><groupId>com.microsoft.azure</groupId><artifactId>azure</artifactId><version>1.37.1</version></dependency>

执行结果的正确输出:

参考资料

使用Java代码启动Azure VM(虚拟机):https://www.cnblogs.com/lulight/p/14295089.html

Run PowerShell scripts in your Windows VM by using Run Command:https://docs.microsoft.com/en-us/azure/virtual-machines/windows/run-command#azure-cli

azure-libraries-for-javaVirtualMachineImpl.java :https://github.com/Azure/azure-libraries-for-java/blob/master/azure-mgmt-compute/src/main/java/com/microsoft/azure/management/compute/implementation/VirtualMachineImpl.java#L400

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 【Azure Developer】调用SDK的runPowerShellScript方法,在Azure VM中执行PowerShell脚本示例