【问题标题】:Azure - Templated EnvironmentAzure - 模板化环境
【发布时间】:2015-01-30 10:04:49
【问题描述】:
我知道您可以在 Azure 中创建 VHD 映像,但我想做的是创建一个模板化环境。这个环境可能有 2 个 Web 服务器、3 个业务逻辑盒、一些 CentOS 机器和一个 DB 盒。
我知道这是雄心勃勃的,但有人知道这是否可能。最终目标是能够从模板中创建相同的环境,而不必费力地将新盒子联网在一起。
【问题讨论】:
标签:
templates
azure
networking
test-environments
【解决方案1】:
是的,你现在完全可以了,过去一周左右我一直在这样做。
使用 Visual Studio(安装 Azure SDK),您现在可以创建一个Azure Resource Group 项目来管理您的资源。
网上有一些关于 Visual Studio 如何使用 Json 模板的优秀指南,我从 Eliot Mansfield 的 video 和源代码 on GitHub 开始,因为我想确保我从模块化方法开始我自己的资源以及客户可能需要的任何资源。
我正在构建我的项目:
但我已经可以在我的资源组中部署 key-vaults、storage accounts、virtual networks、vnet gateways、virtual machines 等,所有这些都在我的资源组中进行组织、参数化和维护,只需单击几下即可:
如果有人想参与这样的项目,这里有一些技巧可以为您节省一些时间:
- 确保模板是模块化的,适当地命名资源是必须的,我采用了 Eliot 的方法,并在所有内容前加上资源类型,记住重新部署模板时不会删除资源,您可以通过修改模板并在大多数情况下重新运行(我认为,尚未测试所有场景,但希望如此!)
- 尽可能使用linked templates,但请记住这些需要发布到在线位置。如果您不公开存储模板,请使用 Azure 的存储帐户。
- 如果您在模板中使用
_artifactsLocation 和_artifactsLocationSasToken 参数,当通过Visual Studio 部署时,它会要求Artifact storage account,Deploy-AzureResourceGroup.ps1 将上传您的所有模板和任何设置为内容的文件项目的文件属性(在解决方案资源管理器中选择文件时按 F4)并替换参数值。但切勿将这些参数值手动包含在参数文件中,因为在尝试将这些参数值替换为生成的值时,部署脚本会失败。
- 我没有测试一个链接模板也链接到另一个模板,对我来说似乎很不整洁,必须将生成的工件存储密钥传递给链接模板,所以我一直在避免这种情况。
-
在变量中构建模板链接,下面是我的一个模板的示例,它使用部署脚本生成的存储帐户位置和 SasToken 参数来访问容器,click here 以了解有关 SasToken 的更多信息。
{
"variables": {
"templates": {
"vm": {
"folder": "nestedtemplates",
"fileName": "vm.json"
},
"deploy": {
"folder": "rg-lab-superadmin",
"fileName": "deploy.sh"
}
},
"templateLinks": {
"vm": "[concat(parameters('_artifactsLocation'), '/', variables('templates').vm.folder, '/', variables('templates').vm.fileName, parameters('_artifactsLocationSasToken'))]",
"deploy": "[concat(parameters('_artifactsLocation'), '/', variables('templates').deploy.folder, '/', variables('templates').deploy.fileName, parameters('_artifactsLocationSasToken'))]"
}
}
}
- 对于要在目标 VM 上执行的脚本,您可以使用与上述工件位置相同的主体,并使用 custom script extension。
- VM 上的自定义脚本应该可以一遍又一遍地重新部署到同一个 VM,因为您可能需要重新部署包括 VM 的整个资源组,而这些脚本需要考虑这一点。
- VNet 资源必须位于同一位置,但不一定位于同一资源组,您可以在模板中对此进行规划,例如,每当我需要 vnet 资源时,我也会询问它所在的资源组,以便您可以创建在您的模板上使用适当的resourceId()。一个常见的情况是,当您创建 VM 时,我的模板还创建了 NIC,这需要正确引用到可能位于另一个资源组上的 vnet。