(重新)部署代码/ bin文件到(多个)Windows Azure虚拟机的方法

Hai*_*ter 9 c# deployment virtual-machine azure azure-configuration

这个问题可能与Azure虚拟机无关,但我希望Azure提供比Amazon EC2更简单的方法.

我在多个Azure虚拟机上运行长期运行的应用程序(即不是Azure网站或[Paas]角色).它们是简单的控制台应用程序/ Windows服务.有时,我会进行代码刷新,需要停止这些进程,更新代码/二进制文件,然后重新启动这些进程.

在过去,我曾尝试使用PSTools(psexec)来远程执行此操作,但这似乎是一种黑客攻击.有没有更好的方法来远程终止应用程序,刷新部署,并重新启动应用程序?

理想情况下,Visual Studio中会有一个" 发布控制台应用程序 "等同于允许我将代码部署为Azure网站,但我猜这是不可能的.

非常感谢任何建议!

Dav*_*gon 3

一种常见模式是将项目(例如命令行应用程序)存储在 Windows Azure Blob 存储中。我经常这样做(例如:我将所有 MongoDB 二进制文件存储在一个 blob 中,经过 zip 压缩,每个版本一个 zip #)。VM 启动后,我有一个任务,将 zip 从 blob 下载到本地磁盘,解压缩到本地文件夹,然后启动 mongod.exe 进程(这同样适用于其他控制台应用程序)。如果您有更复杂的安装,则需要获取 MSI 或其他类型的自动安装程序。将这些应用程序存储在 Blob 存储中有两个好处:

  • 减少部署包大小
  • 不再需要重新部署整个云应用程序来更改其中的一个组件

更新控制台应用程序时:您可以将新版本上传到 Blob 存储。现在您可以通过几种方式向我的虚拟机发出更新信号。例如:

  • 修改我的配置文件(也许我有一个引用我的应用程序名称+版本号的键/值对)。当这种情况发生变化时,我可以在我的网络/辅助角色中处理该事件,从而允许我的代码采取适当的操作。此操作可能是停止 exe,从 blob 中获取新的,然后重新启动。或者...如果比这更复杂,我什至可以让虚拟机实例简单地自行重新启动,清除内存/临时文件/等。并干净地开始一切。
  • 向自己发送某种类型的命令来更新应用程序。我可能会使用服务总线队列来执行此操作,因为我的“软件更新”主题可以有多个订阅者。每个实例都可以订阅队列,并且当更新消息出现时,相应地处理它(也许该消息包含应用程序名称和版本号,就像我们在配置中的键/值对一样)。我还可以为此使用 Windows Azure 存储队列,但随后我可能需要每个实例一个队列(我不喜欢这样做)。
  • 创建我的角色实例侦听的某种类型的 wcf 服务,以便更新命令。与 Windows Azure 队列相同的问题:需要我找到一种方法将相同的消息推送到我的 Web/辅助角色的每个实例。

这些都非常适用于独立 exe(或 xcopy-deployable exe)。对于需要管理员级别权限的 MSI,需要通过启动脚本运行。在这种情况下,您可能有一个配置更改事件,该事件将由您的角色实例处理(如上所述),但您只需重新启动实例,允许它们通过启动脚本运行 MSI。