在现有存储帐户中创建虚拟机

詹姆斯·格里菲斯

我正在Visual Studio中从Azure工具使用C#项目中云子标题下的“ AzureResourceGroup”模板项目。

我想做的是为我的虚拟开发环境创建模板,但是似乎资源管理器模板要求您为每个虚拟机创建一个新的存储帐户。我是否可以创建一个模板来创建新的虚拟机而无需创建新的存储帐户,因为我已经有一个。

我的代码如下,

Powershell脚本{大部分未从模板进行修改}:

#Requires -Version 3.0
#Requires -Module AzureRM.Resources
#Requires -Module Azure.Storage

Param(
    [string] $ResourceGroupLocation = "Australia Southeast",
    [string] $ResourceGroupName = 'vmdevelop',
    [switch] $UploadArtifacts,
    [string] $StorageAccountName,
    [string] $StorageAccountResourceGroupName, 
    [string] $StorageContainerName = $ResourceGroupName.ToLowerInvariant() + '-stageartifacts',
    [string] $TemplateFile = '..\Templates\WindowsVirtualMachine.json',
    [string] $TemplateParametersFile = '..\Templates\WindowsVirtualMachine.parameters.json',
    [string] $ArtifactStagingDirectory = '..\bin\Debug\staging',
    [string] $AzCopyPath = '..\Tools\AzCopy.exe',
    [string] $DSCSourceFolder = '..\DSC'
)

Import-Module Azure -ErrorAction SilentlyContinue

try {
    [Microsoft.Azure.Common.Authentication.AzureSession]::ClientFactory.AddUserAgent("VSAzureTools-$UI$($host.name)".replace(" ","_"), "2.8")
} catch { }

Set-StrictMode -Version 3

$OptionalParameters = New-Object -TypeName Hashtable
$TemplateFile = [System.IO.Path]::Combine($PSScriptRoot, $TemplateFile)
$TemplateParametersFile = [System.IO.Path]::Combine($PSScriptRoot, $TemplateParametersFile)

if ($UploadArtifacts) {
    # Convert relative paths to absolute paths if needed
    $AzCopyPath = [System.IO.Path]::Combine($PSScriptRoot, $AzCopyPath)
    $ArtifactStagingDirectory = [System.IO.Path]::Combine($PSScriptRoot, $ArtifactStagingDirectory)
    $DSCSourceFolder = [System.IO.Path]::Combine($PSScriptRoot, $DSCSourceFolder)

    Set-Variable ArtifactsLocationName '_artifactsLocation' -Option ReadOnly -Force
    Set-Variable ArtifactsLocationSasTokenName '_artifactsLocationSasToken' -Option ReadOnly -Force

    $OptionalParameters.Add($ArtifactsLocationName, $null)
    $OptionalParameters.Add($ArtifactsLocationSasTokenName, $null)

    # Parse the parameter file and update the values of artifacts location and artifacts location SAS token if they are present
    $JsonContent = Get-Content $TemplateParametersFile -Raw | ConvertFrom-Json
    $JsonParameters = $JsonContent | Get-Member -Type NoteProperty | Where-Object {$_.Name -eq "parameters"}

    if ($JsonParameters -eq $null) {
        $JsonParameters = $JsonContent
    }
    else {
        $JsonParameters = $JsonContent.parameters
    }

    $JsonParameters | Get-Member -Type NoteProperty | ForEach-Object {
        $ParameterValue = $JsonParameters | Select-Object -ExpandProperty $_.Name

        if ($_.Name -eq $ArtifactsLocationName -or $_.Name -eq $ArtifactsLocationSasTokenName) {
            $OptionalParameters[$_.Name] = $ParameterValue.value
        }
    }

    $StorageAccountKey = (Get-AzureRmStorageAccountKey -ResourceGroupName $StorageAccountResourceGroupName -Name $StorageAccountName).Key1

    $StorageAccountContext = (Get-AzureRmStorageAccount -ResourceGroupName $StorageAccountResourceGroupName -Name $StorageAccountName).Context

    # Create DSC configuration archive
    if (Test-Path $DSCSourceFolder) {
        Add-Type -Assembly System.IO.Compression.FileSystem
        $ArchiveFile = Join-Path $ArtifactStagingDirectory "dsc.zip"
        Remove-Item -Path $ArchiveFile -ErrorAction SilentlyContinue
        [System.IO.Compression.ZipFile]::CreateFromDirectory($DSCSourceFolder, $ArchiveFile)
    }

    # Generate the value for artifacts location if it is not provided in the parameter file
    $ArtifactsLocation = $OptionalParameters[$ArtifactsLocationName]
    if ($ArtifactsLocation -eq $null) {
        $ArtifactsLocation = $StorageAccountContext.BlobEndPoint + $StorageContainerName
        $OptionalParameters[$ArtifactsLocationName] = $ArtifactsLocation
    }

    # Use AzCopy to copy files from the local storage drop path to the storage account container
    & $AzCopyPath """$ArtifactStagingDirectory""", $ArtifactsLocation, "/DestKey:$StorageAccountKey", "/S", "/Y", "/Z:$env:LocalAppData\Microsoft\Azure\AzCopy\$ResourceGroupName"
    if ($LASTEXITCODE -ne 0) { return }

    # Generate the value for artifacts location SAS token if it is not provided in the parameter file
    $ArtifactsLocationSasToken = $OptionalParameters[$ArtifactsLocationSasTokenName]
    if ($ArtifactsLocationSasToken -eq $null) {
        # Create a SAS token for the storage container - this gives temporary read-only access to the container
        $ArtifactsLocationSasToken = New-AzureStorageContainerSASToken -Container $StorageContainerName -Context $StorageAccountContext -Permission r -ExpiryTime (Get-Date).AddHours(4)
        $ArtifactsLocationSasToken = ConvertTo-SecureString $ArtifactsLocationSasToken -AsPlainText -Force
        $OptionalParameters[$ArtifactsLocationSasTokenName] = $ArtifactsLocationSasToken
    }
}

# Create or update the resource group using the specified template file and template parameters file
New-AzureRmResourceGroup -Name $ResourceGroupName -Location $ResourceGroupLocation -Verbose -Force -ErrorAction Stop 

New-AzureRmResourceGroupDeployment -Name ((Get-ChildItem $TemplateFile).BaseName + '-' + ((Get-Date).ToUniversalTime()).ToString('MMdd-HHmm')) `
                                   -ResourceGroupName $ResourceGroupName `
                                   -TemplateFile $TemplateFile `
                                   -TemplateParameterFile $TemplateParametersFile `
                                   @OptionalParameters `
                                   -Force -Verbose

template.json {已被广泛修改以添加更多参数,而不是在变量中定义大多数更改}

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "adminUsername": {
      "type": "string",
      "minLength": 1,
      "metadata": {
        "description": "Username for the Virtual Machine."
      }
    },
    "ResourceGroupLocation": {
      "type": "string",
      "metadata": {
        "description": "ResourceGroup location"
      }
    },
    "OSDiskName": {
      "type": "string",
      "metadata": {
        "description": "ResourceGroup location"
      }
    },
    "vmSize": {
      "type": "string",
      "metadata": {
        "description": "ResourceGroup location"
      }
    },
    "nicName": {
      "type": "string",
      "metadata": {
        "description": "ResourceGroup location"
      }
    },
    "adminPassword": {
      "type": "securestring",
      "metadata": {
        "description": "Password for the Virtual Machine."
      }
    },
    "publicIPAddressName": {
      "type": "securestring",
      "metadata": {
        "description": "Password for the Virtual Machine."
      }
    },
    "dnsNameForPublicIP": {
      "type": "string",
      "minLength": 1,
      "metadata": {
        "description": "Globally unique DNS Name for the Public IP used to access the Virtual Machine."
      }
    },
    "windowsOSVersion": {
      "type": "string",
      "defaultValue": "2016-Technical-Preview-with-Containers",
      "allowedValues": [
        "2008-R2-SP1",
        "2012-Datacenter",
        "2012-R2-Datacenter",
        "2016-Technical-Preview-with-Containers"
      ],
      "metadata": {
        "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version. Allowed values: 2008-R2-SP1, 2012-Datacenter, 2012-R2-Datacenter."
      }
    }
  },
  "variables": {
    "imagePublisher": "MicrosoftWindowsServer",
    "imageOffer": "WindowsServer",
    "OSDiskName": "[parameters('OSDiskName')]",
    "nicName": "[parameters('nicName')]",
    "addressPrefix": "10.2.0.0/16",
    "subnetName": "Develop1",
    "subnetPrefix": "10.2.0.0/24",
    "vhdStorageType": "Standard_LRS",
    "publicIPAddressName": "[parameters('publicIPAddressName')]",
    "publicIPAddressType": "Dynamic",
    "vhdStorageContainerName": "vhds",
    "vmName": "ContainerHost01",
    "vmSize": "[parameters('vmSize')]",
    "virtualNetworkName": "DevelopmentNetwork",
    "vnetId": "[resourceId('Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]",
    "subnetRef": "[concat(variables('vnetId'), '/subnets/', variables('subnetName'))]",
    "vhdStorageName": "ContainerServer01",
    "diagnosticsStorageAccountName": "[variables('vhdStorageName')]",
    "diagnosticsStorageAccountResourceGroup": "[variables('vhdStorageName')]",
    "accountid": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', variables('diagnosticsStorageAccountResourceGroup'), '/providers/', 'Microsoft.Storage/storageAccounts/', variables('diagnosticsStorageAccountName'))]",
    "wadlogs": "<WadCfg> <DiagnosticMonitorConfiguration overallQuotaInMB=\"4096\" xmlns=\"http://schemas.microsoft.com/ServiceHosting/2010/10/DiagnosticsConfiguration\"> <DiagnosticInfrastructureLogs scheduledTransferLogLevelFilter=\"Error\"/> <WindowsEventLog scheduledTransferPeriod=\"PT1M\" > <DataSource name=\"Application!*[System[(Level = 1 or Level = 2)]]\" /> <DataSource name=\"Security!*[System[(Level = 1 or Level = 2)]]\" /> <DataSource name=\"System!*[System[(Level = 1 or Level = 2)]]\" /></WindowsEventLog>",
    "wadperfcounters1": "<PerformanceCounters scheduledTransferPeriod=\"PT1M\"><PerformanceCounterConfiguration counterSpecifier=\"\\Processor(_Total)\\% Processor Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"CPU utilization\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Processor(_Total)\\% Privileged Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"CPU privileged time\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Processor(_Total)\\% User Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"CPU user time\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Processor Information(_Total)\\Processor Frequency\" sampleRate=\"PT15S\" unit=\"Count\"><annotation displayName=\"CPU frequency\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\System\\Processes\" sampleRate=\"PT15S\" unit=\"Count\"><annotation displayName=\"Processes\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Process(_Total)\\Thread Count\" sampleRate=\"PT15S\" unit=\"Count\"><annotation displayName=\"Threads\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Process(_Total)\\Handle Count\" sampleRate=\"PT15S\" unit=\"Count\"><annotation displayName=\"Handles\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Memory\\% Committed Bytes In Use\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"Memory usage\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Memory\\Available Bytes\" sampleRate=\"PT15S\" unit=\"Bytes\"><annotation displayName=\"Memory available\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Memory\\Committed Bytes\" sampleRate=\"PT15S\" unit=\"Bytes\"><annotation displayName=\"Memory committed\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Memory\\Commit Limit\" sampleRate=\"PT15S\" unit=\"Bytes\"><annotation displayName=\"Memory commit limit\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\% Disk Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"Disk active time\" locale=\"en-us\"/></PerformanceCounterConfiguration>",
    "wadperfcounters2": "<PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\% Disk Read Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"Disk active read time\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\% Disk Write Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"Disk active write time\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Transfers/sec\" sampleRate=\"PT15S\" unit=\"CountPerSecond\"><annotation displayName=\"Disk operations\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Reads/sec\" sampleRate=\"PT15S\" unit=\"CountPerSecond\"><annotation displayName=\"Disk read operations\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Writes/sec\" sampleRate=\"PT15S\" unit=\"CountPerSecond\"><annotation displayName=\"Disk write operations\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Bytes/sec\" sampleRate=\"PT15S\" unit=\"BytesPerSecond\"><annotation displayName=\"Disk speed\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Read Bytes/sec\" sampleRate=\"PT15S\" unit=\"BytesPerSecond\"><annotation displayName=\"Disk read speed\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Write Bytes/sec\" sampleRate=\"PT15S\" unit=\"BytesPerSecond\"><annotation displayName=\"Disk write speed\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\LogicalDisk(_Total)\\% Free Space\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"Disk free space (percentage)\" locale=\"en-us\"/></PerformanceCounterConfiguration></PerformanceCounters>",
    "wadcfgxstart": "[concat(variables('wadlogs'), variables('wadperfcounters1'), variables('wadperfcounters2'), '<Metrics resourceId=\"')]",
    "wadmetricsresourceid": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', variables('diagnosticsStorageAccountResourceGroup'), '/providers/', 'Microsoft.Compute/virtualMachines/', variables('vmName'))]",
    "wadcfgxend": "><MetricAggregation scheduledTransferPeriod=\"PT1H\"/><MetricAggregation scheduledTransferPeriod=\"PT1M\"/></Metrics></DiagnosticMonitorConfiguration></WadCfg>"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[variables('vhdStorageName')]",
      "apiVersion": "2015-06-15",
      "location": "[parameters('ResourceGroupLocation')]",
      "tags": {
        "displayName": "[variables('vhdStorageName')]"
      },
      "properties": {
        "accountType": "[variables('vhdStorageType')]"
      }
    },
    {
      "apiVersion": "2015-05-01-preview",
      "type": "Microsoft.Network/publicIPAddresses",
      "name": "[variables('publicIPAddressName')]",
      "location": "[parameters('ResourceGroupLocation')]",
      "tags": {
        "displayName": "PublicIPAddress"
      },
      "properties": {
        "publicIPAllocationMethod": "[variables('publicIPAddressType')]",
        "dnsSettings": {
          "domainNameLabel": "[parameters('dnsNameForPublicIP')]"
        }
      }
    },
    {
      "apiVersion": "2015-05-01-preview",
      "type": "Microsoft.Network/virtualNetworks",
      "name": "[variables('virtualNetworkName')]",
      "location": "[parameters('ResourceGroupLocation')]",
      "tags": {
        "displayName": "VirtualNetwork"
      },
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "[variables('addressPrefix')]"
          ]
        },
        "subnets": [
          {
            "name": "[variables('subnetName')]",
            "properties": {
              "addressPrefix": "[variables('subnetPrefix')]"
            }
          }
        ]
      }
    },
    {
      "apiVersion": "2015-05-01-preview",
      "type": "Microsoft.Network/networkInterfaces",
      "name": "[variables('nicName')]",
      "location": "[parameters('ResourceGroupLocation')]",
      "tags": {
        "displayName": "NetworkInterface"
      },
      "dependsOn": [
        "[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]",
        "[concat('Microsoft.Network/virtualNetworks/', variables('virtualNetworkName'))]"
      ],
      "properties": {
        "ipConfigurations": [
          {
            "name": "ipconfig1",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "publicIPAddress": {
                "id": "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))]"
              },
              "subnet": {
                "id": "[variables('subnetRef')]"
              }
            }
          }
        ]
      }
    },
    {
      "apiVersion": "2015-06-15",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "[variables('vmName')]",
      "location": "[parameters('ResourceGroupLocation')]",
      "tags": {
        "displayName": "VirtualMachine"
      },
      "dependsOn": [
        "[concat('Microsoft.Storage/storageAccounts/', variables('vhdStorageName'))]",
        "[concat('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
      ],
      "properties": {
        "hardwareProfile": {
          "vmSize": "[variables('vmSize')]"
        },
        "osProfile": {
          "computerName": "[variables('vmName')]",
          "adminUsername": "[parameters('adminUsername')]",
          "adminPassword": "[parameters('adminPassword')]"
        },
        "storageProfile": {
          "imageReference": {
            "publisher": "[variables('imagePublisher')]",
            "offer": "[variables('imageOffer')]",
            "sku": "[parameters('windowsOSVersion')]",
            "version": "latest"
          },
          "osDisk": {
            "name": "osdisk",
            "vhd": {
              "uri": "[concat('http://', variables('vhdStorageName'), '.blob.core.windows.net/', variables('vhdStorageContainerName'), '/', variables('OSDiskName'), '.vhd')]"
            },
            "caching": "ReadWrite",
            "createOption": "FromImage"
          }
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[resourceId('Microsoft.Network/networkInterfaces', variables('nicName'))]"
            }
          ]
        },
        "diagnosticsProfile": {
          "bootDiagnostics": {
            "enabled": true,
            "storageUri": "[concat('http://', variables('diagnosticsStorageAccountName'), '.blob.core.windows.net')]"
          }
        }
      },
      "resources": [
        {
          "type": "extensions",
          "name": "Microsoft.Insights.VMDiagnosticsSettings",
          "apiVersion": "2015-06-15",
          "location": "[parameters('ResourceGroupLocation')]",
          "tags": {
            "displayName": "AzureDiagnostics"
          },
          "dependsOn": [
            "[concat('Microsoft.Compute/virtualMachines/', variables('vmName'))]"
          ],
          "properties": {
            "publisher": "Microsoft.Azure.Diagnostics",
            "type": "IaaSDiagnostics",
            "typeHandlerVersion": "1.5",
            "autoUpgradeMinorVersion": true,
            "settings": {
              "xmlCfg": "[base64(concat(variables('wadcfgxstart'), variables('wadmetricsresourceid'), variables('wadcfgxend')))]",
              "storageAccount": "[variables('diagnosticsStorageAccountName')]"
            },
            "protectedSettings": {
              "storageAccountName": "[variables('diagnosticsStorageAccountName')]",
              "storageAccountKey": "[listkeys(variables('accountid'), '2015-06-15').key1]",
              "storageAccountEndPoint": "https://core.windows.net"
            }
          }
        }
      ]
    }
  ]
}

以下是我未指定要创建的新资源参数时遇到的Powershell错误。

New-AzureRmResourceGroupDeployment : InvalidTemplate: Deployment template validation failed: 'The resource 'Microsoft.Storage/storageAccounts/vmdevelop' is not defined in a template.'.
At C:\Users\James\Documents\Visual Studio 2015\Projects\AzureResourceGroup2\AzureResourceGroup1\Scripts\Deploy-AzureResourceGroup.ps1:98 char:1
+ New-AzureRmResourceGroupDeployment -Name ((Get-ChildItem $TemplateFil ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [New-AzureRmResourceGroupDeployment], CloudException
    + FullyQualifiedErrorId : Hyak.Common.CloudException,Microsoft.Azure.Commands.Resources.NewAzureResourceGroupDeploymentCommand

如果我定义了一个预先存在的存储帐户,以下是脚本的输出。

PS C:\Users\James> C:\Users\James\Documents\Visual Studio 2015\Projects\AzureResourceGroup2\AzureResourceGroup1\Scripts\Deploy-AzureResourceGroup.ps1
VERBOSE: 9:19:58 AM - Created resource group 'VMDEVELOP' in location 'australiasoutheast'


ResourceGroupName : VMDEVELOP
Location          : australiasoutheast
ProvisioningState : Succeeded
Tags              : 
Resources         : 
                    Name                Type                               Location          
                    ==================  =================================  ==================
                    DevelopmentNetwork  Microsoft.Network/virtualNetworks  australiasoutheast
                    vmdevelop           Microsoft.Storage/storageAccounts  australiasoutheast

ResourceId        : /subscriptions/<ID>/resourceGroups/VMDEVELOP

cmdlet New-AzureRmResourceGroupDeployment at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
VERBOSE: 9:20:05 AM - Create template deployment 'WindowsVirtualMachine-1214-2219'.
New-AzureRmResourceGroupDeployment : 9:20:10 AM - Resource Microsoft.Storage/storageAccounts 'vmdevelop' failed with message 'The storage account named vmdevelop already exists under the 
subscription.'
At C:\Users\James\Documents\Visual Studio 2015\Projects\AzureResourceGroup2\AzureResourceGroup1\Scripts\Deploy-AzureResourceGroup.ps1:98 char:1
+ New-AzureRmResourceGroupDeployment -Name ((Get-ChildItem $TemplateFil ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [New-AzureRmResourceGroupDeployment], Exception
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.Resources.NewAzureResourceGroupDeploymentCommand

VERBOSE: 9:20:14 AM - Resource Microsoft.Network/virtualNetworks 'DevelopmentNetwork' provisioning status is succeeded
VERBOSE: 9:20:14 AM - Resource Microsoft.Network/publicIPAddresses 'Cont01VMPublicIP' provisioning status is running
VERBOSE: 9:20:27 AM - Resource Microsoft.Network/networkInterfaces 'ContVMNic01' provisioning status is succeeded
VERBOSE: 9:20:27 AM - Resource Microsoft.Network/publicIPAddresses 'Cont01VMPublicIP' provisioning status is succeeded

DeploymentName     : WindowsVirtualMachine-1214-2219
CorrelationId      : <ID>
ResourceGroupName  : vmdevelop
ProvisioningState  : Failed
Timestamp          : 14/12/2015 10:20:43 PM
Mode               : Incremental
TemplateLink       : 
TemplateLinkString : 
Parameters         : {[adminUsername, Microsoft.Azure.Commands.Resources.Models.DeploymentVariable], [storageAccountName, Microsoft.Azure.Commands.Resources.Models.DeploymentVariable], 
                     [resourceGroupLocation, Microsoft.Azure.Commands.Resources.Models.DeploymentVariable], [osDiskName, Microsoft.Azure.Commands.Resources.Models.DeploymentVariable]...}
ParametersString   : 
                     Name             Type                       Value     
                     ===============  =========================  ==========
                     adminUsername    String                     admin  
                     storageAccountName  String                     vmdevelop 
                     resourceGroupLocation  String                     Australia Southeast
                     osDiskName       String                     Container01VHD
                     vmSize           String                     Standard_A1
                     nicName          String                     ContVMNic01
                     adminPassword    SecureString                         
                     publicIPAddressName  SecureString                         
                     dnsNameForPublicIP  String                     containerserver01
                     windowsOSVersion  String                     2016-Technical-Preview-with-Containers
                     vmdevelopType    String                     Standard_LRS

Outputs            : 
OutputsString      : 




PS C:\Users\James> 
詹姆斯·格里菲斯

在遵循了Michael B的链接并开始一个新模板之后,我遇到了dependsOn指令,并扫描了我的原始模板并发现

{
  "apiVersion": "2015-06-15",
  "type": "Microsoft.Compute/virtualMachines",
  "name": "[variables('vmName')]",
  "location": "[parameters('ResourceGroupLocation')]",
  "tags": {
    "displayName": "VirtualMachine"
  },
  "dependsOn": [
    "[concat('Microsoft.Storage/storageAccounts/', variables('vhdStorageName'))]",
    "[concat('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
  ],

当我从模板中删除存储资源并运行脚本时出现的问题:

New-AzureRmResourceGroupDeployment : InvalidTemplate: Deployment template validation failed: 'The resource 'Microsoft.Storage/storageAccounts/vmdevelop' is not defined in a template.'.

原因是以下几行(上面模板中的187仍然有存储资源)

"[concat('Microsoft.Storage/storageAccounts/', variables('vhdStorageName'))]",

删除导致创建新存储帐户的依赖项的这一行已解决了该问题,现在我可以将VM部署到虚拟机具有的预分配存储容器中。

谢谢大家的贡献,我非常感激:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在现有的虚拟机中创建虚拟监视器

来自分类Dev

使现有虚拟机不可变

来自分类Dev

在 azure cli 中显示现有虚拟机大小的大小

来自分类Dev

如何在没有Azure虚拟IP(VIP)地址的Microsoft Azure中创建虚拟机?

来自分类Dev

如何从虚拟机引导现有的OS /磁盘?

来自分类Dev

有没有办法使用现有文件重新创建虚拟机?

来自分类Dev

如何使用ARM模板创建新磁盘并将其附加到现有Windows虚拟机?

来自分类Dev

从映像创建虚拟机并将其添加到现有的可用性集

来自分类Dev

在我的虚拟机中查找证书存储名称

来自分类Dev

如何从主机打开存储在虚拟机中的文件?

来自分类Dev

如何在kvm中创建没有os的空虚拟机?

来自分类Dev

如何在kvm中创建没有os的空虚拟机?

来自分类Dev

在带有 ssd(固态)硬盘的虚拟机中如何创建 hdd 硬盘?

来自分类Dev

ansible 中是否有用于跨多个主机创建虚拟机的平衡概念?

来自分类Dev

为什么我的VirtualBox虚拟机没有出现在VBoxManage列表虚拟机中,但是重新创建失败

来自分类Dev

无法在virt-manager中创建虚拟机

来自分类Dev

无法在 ESXI 6.5 web gui 中创建虚拟机

来自分类Dev

在虚拟机中创建一个分区!

来自分类Dev

无法在 MacOS 中创建 Java 虚拟机

来自分类Dev

如何将Azure虚拟机规模集部署到现有虚拟网络?

来自分类Dev

如何将Azure虚拟机规模集部署到现有虚拟网络?

来自分类Dev

Windows 7虚拟机中没有LPT端口

来自分类Dev

虚拟机中带有Gnome的空白桌面

来自分类Dev

GCP从另一个帐户访问一个帐户的快照以创建虚拟机实例

来自分类Dev

在虚拟机中恢复用户帐户(尝试扩展内存后)

来自分类Dev

计算引擎虚拟机创建通知

来自分类Dev

从Encase映像创建虚拟机

来自分类Dev

获取虚拟机创建日期

来自分类Dev

VirtualBox无法创建新的虚拟机!

Related 相关文章

  1. 1

    如何在现有的虚拟机中创建虚拟监视器

  2. 2

    使现有虚拟机不可变

  3. 3

    在 azure cli 中显示现有虚拟机大小的大小

  4. 4

    如何在没有Azure虚拟IP(VIP)地址的Microsoft Azure中创建虚拟机?

  5. 5

    如何从虚拟机引导现有的OS /磁盘?

  6. 6

    有没有办法使用现有文件重新创建虚拟机?

  7. 7

    如何使用ARM模板创建新磁盘并将其附加到现有Windows虚拟机?

  8. 8

    从映像创建虚拟机并将其添加到现有的可用性集

  9. 9

    在我的虚拟机中查找证书存储名称

  10. 10

    如何从主机打开存储在虚拟机中的文件?

  11. 11

    如何在kvm中创建没有os的空虚拟机?

  12. 12

    如何在kvm中创建没有os的空虚拟机?

  13. 13

    在带有 ssd(固态)硬盘的虚拟机中如何创建 hdd 硬盘?

  14. 14

    ansible 中是否有用于跨多个主机创建虚拟机的平衡概念?

  15. 15

    为什么我的VirtualBox虚拟机没有出现在VBoxManage列表虚拟机中,但是重新创建失败

  16. 16

    无法在virt-manager中创建虚拟机

  17. 17

    无法在 ESXI 6.5 web gui 中创建虚拟机

  18. 18

    在虚拟机中创建一个分区!

  19. 19

    无法在 MacOS 中创建 Java 虚拟机

  20. 20

    如何将Azure虚拟机规模集部署到现有虚拟网络?

  21. 21

    如何将Azure虚拟机规模集部署到现有虚拟网络?

  22. 22

    Windows 7虚拟机中没有LPT端口

  23. 23

    虚拟机中带有Gnome的空白桌面

  24. 24

    GCP从另一个帐户访问一个帐户的快照以创建虚拟机实例

  25. 25

    在虚拟机中恢复用户帐户(尝试扩展内存后)

  26. 26

    计算引擎虚拟机创建通知

  27. 27

    从Encase映像创建虚拟机

  28. 28

    获取虚拟机创建日期

  29. 29

    VirtualBox无法创建新的虚拟机!

热门标签

归档