【问题标题】:How to set some unique identifier to each Windows Azure Virtual Machine operating system如何为每个 Windows Azure 虚拟机操作系统设置一些唯一标识符
【发布时间】:2012-09-18 06:08:02
【问题描述】:

我有一些使用相同配置运行的虚拟机。在这些虚拟机上我已经安装了我的应用程序。

我想在我的 VM 中设置一些自定义唯一标识符,以便我知道如果特定(来自我的应用程序)请求来自该请求来自哪个 VM(或者该应用程序在哪个 VM 中运行)。由于同一应用程序在所有 VM 中运行,因此为了区分每个请求,我想在创建虚拟机时设置一些唯一的自定义标识符。

我想在创建虚拟机时设置一些系统属性/环境变量。

我正在使用 Windows Azure Rest API 和 Java 在 Windows Azure 门户上创建和管理虚拟机。我想通过使用 Java 编程语言来实现这一点。

如果您有相同的信息,请告诉我。

【问题讨论】:

    标签: java azure environment-variables virtual-machine azure-vm-role


    【解决方案1】:

    每个实例都应该有一个不同的 SID,因为这些机器是使用 generalize 选项进行系统准备的(当您想要提供自定义图像时同样适用)。您可以使用this question 中的代码获取 SID,并将其用作标识符:

            string domainName;
            Helper.SID_NAME_USE accountType;
            SecurityIdentifier machineSID = 
                    Helper.LookupAccountName("", Environment.MachineName, out domainName, out accountType);
    

    注意:即使它在代码中显示 domainName,您的计算机也不需要在域中才能正常工作。

    要在您的 VM 上设置“自定义标识符”,您可以使用环境变量。由于您使用的是 Java,因此设置这些的最简单方法可能是 setx.exe 命令行工具 (download)。您可以这样调用该工具:

    setx.exe VmIdentifier 123 -m
    

    那么你应该可以使用 System: 阅读它:

    System.getenv("VmIdentifier")
    

    我不清楚您使用的是虚拟机 (IaaS) 还是云服务 (PaaS)。如果您使用的是虚拟机,则由您自行部署应用程序,同时您还可以执行 setx.exe。

    现在,如果您使用云服务,您实际上上传了一个包,该包将部署在您的实例上。您还可以获得对启动任务(在您的应用程序启动之前运行)的支持:How to Define Startup Tasks for a Role。您可以使用启动任务来运行 setx.exe,但请确保在运行时将 executionContext 设置为提升。

    【讨论】:

    • 感谢您的回复,我想设置自己的唯一标识符,然后稍后从该 VM 内运行的应用程序中检索它。
    • 非常感谢您的回答。我想在 Azure 云环境中以编程方式部署该虚拟机时设置标识符。因此,一旦我启动该机器,我就设置该环境变量。
    • 您是在部署 WebRole/WorkerRole 还是虚拟机?
    • 我正在部署 VirtualMachineRole。
    • 噢.. 一个虚拟机角色?这些不支持启动任务并且不是持久的。我认为您最好的选择是在 ServiceConfiguration.cscfg 中添加标识符(可能类似于:Instance_1 = 12345939,Instance_2 = 29298483,...)。然后可以通过com.microsoft.windowsazure.serviceruntime.RoleEnvironment.getCurrentRoleInstance获取当前实例,找到匹配的设置。但我不认为有一个干净的解决方案。
    【解决方案2】:

    您可以使用远程桌面服务连接到您的虚拟机,因此连接并添加一个设置到您的应用程序的 web.config 文件以标识部署,或者如果您希望您的 web.config 文件相同,应该很简单,然后你可以上传一个小文本文件。

    或者,您的服务器必须已经有一个唯一的名称。我假设您正在运行 .Net 应用程序?如果是这样,那么您应该能够使用Server.MachineName (http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.machinename%28v=vs.71%29.aspx) 来获取运行代码的盒子的唯一名称。

    【讨论】:

    • 感谢您的回复。我正在运行一个 java 应用程序。我计划是否可以为每个 VM 设置一些对每个 VM 唯一的环境变量,然后在该 VM 上运行的任何应用程序都可以访问该特定 VM 并发送每个请求。但是如何在虚拟机操作系统中设置环境变量。
    • 不客气,虽然我不认为我做得很好!您可能想重新表述您的问题 - 添加 Java 和对 Path vars 的需求将使某人更容易回答,并且将 Java 添加到标签将从您的开发人员那里获得帮助。我认为大多数人会认为 Azure 问题是关于 .NET 的,除非您明确标记它。祝你好运,欢迎来到 Stack Overflow。
    • 感谢您的宝贵建议。我相应地更新了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    相关资源
    最近更新 更多