• 【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 和 arg2
            List<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);
    
            //执行 PowerShell
            RunCommandResult 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 和 arg2
            List<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);
    
            //执行 PowerShell
            RunCommandResult 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 Commandhttps://docs.microsoft.com/en-us/azure/virtual-machines/windows/run-command#azure-cli

    azure-libraries-for-java VirtualMachineImpl.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

    当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!

  • 相关阅读:
    Linux安装nginx
    linux目录结构
    Django-admin
    celery
    Flask-Migrate
    Flask-Script
    Flask-SQLAlchemy
    SQLAlchemy
    mongodb的增删改查
    websocket的加密和解密过程
  • 原文地址:https://www.cnblogs.com/lulight/p/14688943.html
Copyright © 2020-2023  润新知