【发布时间】:2014-03-12 23:55:39
【问题描述】:
有没有办法通过 API 将(参数化的)启动任务添加到 Windows Azure 虚拟机?我需要在机器启动后执行一个 cmdlet,并且代码取决于两个参数,这两个参数对于每台机器都是不同的。我知道这对于 Web/Worker 角色很容易实现,但是对于虚拟机也可以做到吗?
【问题讨论】:
标签: windows powershell azure azure-virtual-machine
有没有办法通过 API 将(参数化的)启动任务添加到 Windows Azure 虚拟机?我需要在机器启动后执行一个 cmdlet,并且代码取决于两个参数,这两个参数对于每台机器都是不同的。我知道这对于 Web/Worker 角色很容易实现,但是对于虚拟机也可以做到吗?
【问题讨论】:
标签: windows powershell azure azure-virtual-machine
对于首次运行 VM,您可以通过 CustomData 注入启动任务。这适用于 Linux 和 Windows VM。您只需要根据 REST API 文档正确地对您的文件(无论是文本还是二进制文件)进行 base-64 编码。
CustomData 被放入特定位置的文件中,您可以使用代码查找该文件,并根据需要采取某种类型的启动操作:
%SYSTEMDRIVE%\AzureData\CustomData.bin
/var/lib/waagent/CustomData
注意:这也将被添加到 CLI 中(拉取请求已经可用 - 不确定它是否在最新版本中。
编辑是的,customdata 现在是 Azure CLI 的一部分,作为 azure vm create 的参数,因此无需自己搞乱 base-64 编码:
【讨论】:
没有。目前没有提供开箱即用的此类功能。
但是,鉴于您无论如何都会处理 VM,您可以创建自己的映像。您可以在RunOnce registry key 中注册“启动任务”。并使用此设置对操作系统进行 sysprep。
这样你基本上会有一个启动任务,它会在你的机器第一次启动时执行,而不会在随后的 VM 重新启动时执行。
将参数带入 VM 的代码对于 Web/Worker 角色来说并不容易。对于任何你想要的东西,你必须直接查询 Azure 管理 API。您可以从 Azure VM 上运行的代码中获得的唯一属性基本上是正常的操作系统属性 - 即主机名、主机 IP 地址。您甚至不知道您的云服务名称,也不知道您的虚拟 IP 地址(这可以通过 whatismyip.net 或类似服务发现)。所以我的方法是将参数放入 Azure 表存储并使用机器名称作为 rowKey。因此,我可以根据 VM 名称存储任何特定于 VM 的值。我的“启动”任务将查询表存储,提供我的主机名作为 rowKey(以及分区键的一些常见模式),因此它可以获得所有必需的设置。
【讨论】:
使用IaaS Management Studio,您可以设置一个启动脚本,该脚本将在您的 VM 启动时运行。 总之,它会在检测到 powershell 端口打开时激活远程 powershell 并远程运行您的脚本。
我是这个工具的开发者,但我不明白你所说的“参数化”是什么意思,换句话说,你希望你的脚本能够访问虚拟机信息?
【讨论】: