如何在使用ARM模板的Azure VM部署期间运行PowerShell脚本?

时间:2018-07-15 19:42:42

标签: powershell azure azure-resource-manager arm-template

我想使用Azure资源管理器(ARM)在Azure中部署VM,然后在VM部署后的内部运行PowerShell脚本进行配置。

我可以使用以下类似的方法来做到这一点:https://github.com/Azure/azure-quickstart-templates/tree/master/201-vm-vsts-agent

但是,该模板从GitHub获取PowerShell脚本。作为部署的一部分,我想将脚本上传到Azure存储,然后让VM从Azure存储获取脚本并运行它。我该如何处理关于PowerShell脚本的依赖性,因为它必须在执行之前先存在于Azure存储中。

当前,我具有在部署过程中安装VSTS代理的功能,但是该脚本是从GitHub下载的,我不想这样做,我希望VSTS代理的安装脚本成为我的ARM的一部分项目。

{
          "name": "vsts-build-agents",
          "type": "extensions",
          "location": "[parameters('location')]",
          "apiVersion": "2017-12-01",
          "dependsOn": [
            "vsts-build-vm"
          ],
          "tags": {
            "displayName": "VstsInstallScript"
          },
          "properties": {
            "publisher": "Microsoft.Compute",
            "type": "CustomScriptExtension",
            "typeHandlerVersion": "1.9",
            "settings": {
              "fileUris": [
                "[concat(parameters('_artifactsLocation'), '/', variables('powerShell').folder, '/', variables('powerShell').script, parameters('_artifactsLocationSasToken'))]"
              ]
            },
            "protectedSettings": {
              "commandToExecute": "[concat('powershell.exe -ExecutionPolicy Unrestricted -Command \"& {', './', variables('powerShell').script, ' ', variables('powerShell').buildParameters, '}\"')]"
            }
          }
        }

我想我的问题确实是关于如何将_azurestoragelocation设置为在部署中刚刚上载脚本的蔚蓝存储位置。

2 个答案:

答案 0 :(得分:1)

鸡肉\鸡蛋问题。您无法使用arm模板上传到Azure存储,您需要使用脚本来上传到Azure存储,但是如果您在vm上具有该脚本来上传它,那么您确实不需要上传它。

话虽这么说,为什么不使用VSTS代理扩展?

{
    "name": "xxx",
    "apiVersion": "2015-01-01",
    "type": "Microsoft.Resources/deployments",
    "properties": {
        "mode": "Incremental",
        "templateLink": {
            "uri": "https://gallery.azure.com/artifact/20161101/microsoft.vsts-agent-windows-arm.1.0.0/Artifacts/MainTemplate.json"
        },
        "parameters": {
            "vmName": {
                "value": "xxx"
            },
            "location": {
                "value": "xxx"
            },
            "VSTSAccountName": {
                "value": "xxx"
            },
            "TeamProject": {
                "value": "xxx"
            },
            "DeploymentGroup": {
                "value": "Default"
            },
            "AgentName": {
                "value": "xxx"
            },
            "PATToken": {
                "value": "xxx"
            }
        }
    }
},

答案 1 :(得分:0)

您是说如何像快速入门示例中那样设置_artifactsLocation?如果是这样,您有2个选项(或3个选项)

1)使用QS存储库中的脚本,_artifactsLocation参数的defaultValue将为您设置该值...

2)如果您想从示例的本地副本中进行自定义,只需在回购中使用Deploy-AzureResourceGroup.ps1,它将相应地暂存并设置值(使用-UploadArtifacts开关时)

3)自己将PS1登台,并手动设置_artifactsLocation和_artifactsLocationSasToken的值

您也可以从gallery.azure.com进行部署,但这将迫使您使用存储在厨房中的脚本(与使用GitHub中的默认值相同)

有帮助吗?