2016-10-03 1 views
0

Ich habe versucht, ein Azure Application Gateway für die Front-Anwendung auf vorhandenen VMs bereitzustellen und Hostnamen für die Poolauswahl zu verwenden. Ich begann mit dieser Vorlage von git https://github.com/Azure/azure-quickstart-templates/tree/master/201-application-gateway-multihosting auf dem Artikel basierte https://github.com/Azure/azure-content/blob/master/articles/application-gateway/application-gateway-multi-site-overview.mdWie stelle ich ein Application Gateway mit dahinter liegenden VMs bereit?

Hier ist die modifed tempate I

verwendet
{ 
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
"contentVersion": "1.0.0.0", 
"parameters": { 
    "vnetAddressPrefix": { 
     "type": "string", 
     "defaultValue": "10.0.0.0/16", 
     "metadata": { 
      "description": "Address prefix for the Virtual Network" 
     } 
    }, 
    "subnetPrefix": { 
     "type": "string", 
     "defaultValue": "10.0.0.0/28", 
     "metadata": { 
      "description": "Gateway Subnet prefix" 
     } 
    }, 
    "skuName": { 
     "type": "string", 
     "allowedValues": [ 
      "Standard_Small", 
      "Standard_Medium", 
      "Standard_Large" 
     ], 
     "defaultValue": "Standard_Small", 
     "metadata": { 
      "description": "Sku Name" 
     } 
    }, 
    "capacity": { 
     "type": "int", 
     "defaultValue": 4, 
     "metadata": { 
      "description": "Number of instances" 
     } 
    }, 
    "backendIpAddress1": { 
     "type": "string", 
     "metadata": { 
      "description": "IP Address for Backend Server 1" 
     } 
    }, 
    "backendIpAddress2": { 
     "type": "string", 
     "metadata": { 
      "description": "IP Address for Backend Server 2" 
     } 
    }, 
    "backendIpAddress3": { 
     "type": "string", 
     "metadata": { 
      "description": "IP Address for Backend Server 3" 
     } 
    }, 
    "backendIpAddress4": { 
     "type": "string", 
     "metadata": { 
      "description": "IP Address for Backend Server 4" 
     } 
    }, 
    "backendIpAddress5": { 
     "type": "string", 
     "metadata": { 
      "description": "IP Address for Backend Server 5" 
     } 
    }, 
    "backendIpAddress6": { 
     "type": "string", 
     "metadata": { 
      "description": "IP Address for Backend Server 6" 
     } 
    }, 
    "hostName1": { 
     "type": "string", 
     "metadata": { 
      "description": "HostName for listener 1" 
     } 
    }, 
    "hostName2": { 
     "type": "string", 
     "metadata": { 
      "description": "HostName for listener 2" 
     } 
    }, 
    "certData1": { 
     "type": "securestring", 
     "metadata": { 
      "description": "Base-64 encoded form of the .pfx file" 
     } 
    }, 
    "certPassword1": { 
     "type": "securestring", 
     "metadata": { 
      "description": "Password for .pfx certificate" 
     } 
    } 
}, 
"variables": { 
    "applicationGatewayName": "PortalGateway", 
    "publicIPAddressName": "PortalGatewayFrontendIP", 
    "virtualNetworkName": "PalitonNetworks-East-VirtualNetwork", 
    "subnetName": "GWSubnet1", 
    "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('virtualNetworkName'))]", 
    "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]", 
    "publicIPRef": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]", 
    "applicationGatewayID": "[resourceId('Microsoft.Network/applicationGateways',variables('applicationGatewayName'))]", 
    "apiVersion": "2015-06-15" 
}, 
"resources": [ 
    { 
     "apiVersion": "[variables('apiVersion')]", 
     "type": "Microsoft.Network/publicIPAddresses", 
     "name": "[variables('publicIPAddressName')]", 
     "location": "[resourceGroup().location]", 
     "properties": { 
      "publicIPAllocationMethod": "Dynamic" 
     } 
    }, 
    { 
     "apiVersion": "[variables('apiVersion')]", 
     "type": "Microsoft.Network/virtualNetworks", 
     "name": "[variables('virtualNetworkName')]", 
     "location": "[resourceGroup().location]", 
     "properties": { 
      "addressSpace": { 
       "addressPrefixes": [ 
        "[parameters('vnetAddressPrefix')]" 
       ] 
      }, 
      "subnets": [ 
       { 
        "name": "[variables('subnetName')]", 
        "properties": { 
         "addressPrefix": "[parameters('subnetPrefix')]" 
        } 
       } 
      ] 
     } 
    }, 
    { 
     "apiVersion": "[variables('apiVersion')]", 
     "name": "[variables('applicationGatewayName')]", 
     "type": "Microsoft.Network/applicationGateways", 
     "location": "[resourceGroup().location]", 
     "dependsOn": [ 
      "[concat('Microsoft.Network/virtualNetworks/', variables('virtualNetworkName'))]", 
      "[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]" 
     ], 
     "properties": { 
      "sku": { 
       "name": "[parameters('skuName')]", 
       "tier": "Standard", 
       "capacity": "[parameters('capacity')]" 
      }, 
      "sslCertificates": [ 
       { 
        "name": "appGatewaySslCert1", 
        "properties": { 
         "data": "[parameters('certData1')]", 
         "password": "[parameters('certPassword1')]" 
        } 
       } 

      ], 
      "gatewayIPConfigurations": [ 
       { 
        "name": "appGatewayIpConfig", 
        "properties": { 
         "subnet": { 
          "id": "[variables('subnetRef')]" 
         } 
        } 
       } 
      ], 
      "frontendIPConfigurations": [ 
       { 
        "name": "appGatewayFrontendIP", 
        "properties": { 
         "PublicIPAddress": { 
          "id": "[variables('publicIPRef')]" 
         } 
        } 
       } 
      ], 
      "frontendPorts": [ 
       { 
        "name": "appGatewayFrontendPort1", 
        "properties": { 
         "Port": 443 
        } 
       }, 
       { 
        "name": "appGatewayFrontendPort2", 
        "properties": { 
         "Port": 80 
        } 
       } 
      ], 
      "backendAddressPools": [ 
       { 
        "name": "appGatewayBackendPool1", 
        "properties": { 
         "BackendAddresses": [ 
          { 
           "IpAddress": "[parameters('backendIpAddress1')]" 
          }, 
          { 
           "IpAddress": "[parameters('backendIpAddress2')]" 
          }, 
          { 
           "IpAddress": "[parameters('backendIpAddress3')]" 
          } 
         ] 
        } 
       }, 
       { 
        "name": "appGatewayBackendPool2", 
        "properties": { 
         "BackendAddresses": [ 
          { 
           "IpAddress": "[parameters('backendIpAddress4')]" 
          }, 
          { 
           "IpAddress": "[parameters('backendIpAddress5')]" 
          }, 
          { 
           "IpAddress": "[parameters('backendIpAddress6')]" 
          } 
         ] 
        } 
       } 
      ], 
      "backendHttpSettingsCollection": [ 
       { 
        "name": "appGatewayBackendHttpSettings", 
        "properties": { 
         "Port": 80, 
         "Protocol": "Http", 
         "CookieBasedAffinity": "Disabled" 
        } 
       }, 
       { 
        "name": "appGatewayBackendHttpsSettings", 
        "properties": { 
         "Port": 443, 
         "Protocol": "Https", 
         "CookieBasedAffinity": "Disabled" 
        } 
       } 
      ], 
      "httpListeners": [ 
       { 
        "name": "appGatewayHttpsListener-Group1", 
        "properties": { 
         "FrontendIPConfiguration": { 
          "Id": "[concat(variables('applicationGatewayID'), '/frontendIPConfigurations/appGatewayFrontendIP')]" 
         }, 
         "FrontendPort": { 
          "Id": "[concat(variables('applicationGatewayID'), '/frontendPorts/appGatewayFrontendPort1')]" 
         }, 
         "Protocol": "Https", 
         "SslCertificate": { 
          "Id": "[concat(variables('applicationGatewayID'), '/sslCertificates/appGatewaySslCert1')]" 
         }, 
         "HostName": "[parameters('hostName1')]", 
         "RequireServerNameIndication": "false" 
        } 
       }, 
       { 
        "name": "appGatewayHttpsListener-Group2", 
        "properties": { 
         "FrontendIPConfiguration": { 
          "Id": "[concat(variables('applicationGatewayID'), '/frontendIPConfigurations/appGatewayFrontendIP')]" 
         }, 
         "FrontendPort": { 
          "Id": "[concat(variables('applicationGatewayID'), '/frontendPorts/appGatewayFrontendPort1')]" 
         }, 
         "Protocol": "Https", 
         "SslCertificate": { 
          "Id": "[concat(variables('applicationGatewayID'), '/sslCertificates/appGatewaySslCert1')]" 
         }, 
         "HostName": "[parameters('hostName2')]", 
         "RequireServerNameIndication": "false" 
        } 
       }, 
     { 
        "name": "appGatewayHttpListener-Group1", 
        "properties": { 
         "FrontendIPConfiguration": { 
          "Id": "[concat(variables('applicationGatewayID'), '/frontendIPConfigurations/appGatewayFrontendIP')]" 
         }, 
         "FrontendPort": { 
          "Id": "[concat(variables('applicationGatewayID'), '/frontendPorts/appGatewayFrontendPort2')]" 
         }, 
         "Protocol": "Http", 
         "SslCertificate": null, 
         "HostName": "[parameters('hostName1')]", 
         "RequireServerNameIndication": "false" 
        } 
       }, 
     { 
        "name": "appGatewayHttpListener-Group2", 
        "properties": { 
         "FrontendIPConfiguration": { 
          "Id": "[concat(variables('applicationGatewayID'), '/frontendIPConfigurations/appGatewayFrontendIP')]" 
         }, 
         "FrontendPort": { 
          "Id": "[concat(variables('applicationGatewayID'), '/frontendPorts/appGatewayFrontendPort2')]" 
         }, 
         "Protocol": "Http", 
         "SslCertificate": null, 
         "HostName": "[parameters('hostName2')]", 
         "RequireServerNameIndication": "false" 
        } 
       } 
      ], 
      "requestRoutingRules": [ 
       { 
        "Name": "Group1-SSL", 
        "properties": { 
         "RuleType": "Basic", 
         "httpListener": { 
          "id": "[concat(variables('applicationGatewayID'), '/httpListeners/appGatewayHttpsListener-Group1')]" 
         }, 
         "backendAddressPool": { 
          "id": "[concat(variables('applicationGatewayID'), '/backendAddressPools/appGatewayBackendPool1')]" 
         }, 
         "backendHttpSettings": { 
          "id": "[concat(variables('applicationGatewayID'), '/backendHttpSettingsCollection/appGatewayBackendHttpSettings')]" 
         } 
        } 
       }, 
       { 
        "Name": "Group2-SSL", 
        "properties": { 
         "RuleType": "Basic", 
         "httpListener": { 
          "id": "[concat(variables('applicationGatewayID'), '/httpListeners/appGatewayHttpsListener-Group2')]" 
         }, 
         "backendAddressPool": { 
          "id": "[concat(variables('applicationGatewayID'), '/backendAddressPools/appGatewayBackendPool2')]" 
         }, 
         "backendHttpSettings": { 
          "id": "[concat(variables('applicationGatewayID'), '/backendHttpSettingsCollection/appGatewayBackendHttpSettings')]" 
         } 
        } 
       }, 
     { 
        "Name": "Group2-www", 
        "properties": { 
         "RuleType": "Basic", 
         "httpListener": { 
          "id": "[concat(variables('applicationGatewayID'), '/httpListeners/appGatewayHttpListener-Group1')]" 
         }, 
         "backendAddressPool": { 
          "id": "[concat(variables('applicationGatewayID'), '/backendAddressPools/appGatewayBackendPool1')]" 
         }, 
         "backendHttpSettings": { 
          "id": "[concat(variables('applicationGatewayID'), '/backendHttpSettingsCollection/appGatewayBackendHttpSettings')]" 
         } 
        } 
       }, 
     { 
        "Name": "Group1-www", 
        "properties": { 
         "RuleType": "Basic", 
         "httpListener": { 
          "id": "[concat(variables('applicationGatewayID'), '/httpListeners/appGatewayHttpListener-Group2')]" 
         }, 
         "backendAddressPool": { 
          "id": "[concat(variables('applicationGatewayID'), '/backendAddressPools/appGatewayBackendPool2')]" 
         }, 
         "backendHttpSettings": { 
          "id": "[concat(variables('applicationGatewayID'), '/backendHttpSettingsCollection/appGatewayBackendHttpSettings')]" 
         } 
        } 
       } 
      ] 
     } 
    } 
] 
} 

Wie Sie mich GWSubnet1 als App-Gateway Subnetz angeben sehen können. Meine Back-End-IPs befinden sich im VMnet1-Subnetz unter demselben virtuellen Netzwerk. Bei der Bereitstellung schlägt es fehl, dass VMnet1 nicht gelöscht werden kann. VMNet1 wird nur indirekt als Back-End-IP referenziert. Warum sollte es versuchen, es zu entfernen? GWSubnet1 ist ein unbenutztes leeres Subnetz gemäß den Bereitstellungsregeln von Azure.

Wenn ich die GUI verwende, kann ich das Gateway erstellen und GWSubnet1 auswählen. Bei Verwendung der GUI ist die erweiterte Funktion zum Einfügen des Hostnamens in den Listener jedoch keine Option und daher können Sie nicht mehrere Listener mit demselben Front-End-Port erstellen. Ich habe versucht, über die GUI und dann das Hinzufügen listners über Poweshell (Version 3.0.0) mit dem folgenden

$hostname = "example1.foo.com" 
$listnername = "group2-az" 
$appgwname = "PortalGateway" 
$rmname = "myrmg" 
$feipname = "appGatewayFrontendIP" 
$fepname = "appGatewayFrontendPort" 
$behttpname = "appGatewayBackendHttpSettings" 


$appgw = Get-AzureRmApplicationGateway -Name $appgwname -ResourceGroupName  $rmname 
$bepool = Get-AzureRmApplicationGatewayBackendAddressPool -ApplicationGateway $appgw -Name "appGatewayBackendPool" 
$behttp = Get-AzureRmApplicationGatewayBackendHttpSettings -ApplicationGateway $appgw -Name $behttpname 



$fipc = Get-AzureRmApplicationGatewayFrontendIPConfig -Name $feipname -ApplicationGateway $appgw 
$fep = Get-AzureRmApplicationGatewayFrontendPort -Name $fepname -ApplicationGateway $appgw 
$result = Add-AzureRmApplicationGatewayHttpListener -ApplicationGateway $appgw -Name "appGatewayHttpListenerGroup1" -Protocol Http -FrontendIPConfiguration $fipc -FrontendPort $fep -HostName $hostname -RequireServerNameIndication false 

Doch was ist zu geschehen scheint, dass es keine Zuhörer fügt es ändert nur die vorhandenen Standard-Listener, dass wird erstellt, wenn Sie das Appgateway über die GUI erstellen. Es macht das, egal welchen Namen ich als Zuhörer wähle.

Ich weiß, dass die Bereitstellungsvorlage funktioniert, da ich eine neue leere Ressourcengruppe erstellen und sie dort bereitstellen kann, und sie wird bereitgestellt. Ich kann es nur scheinbar nicht dorthin bringen, wo es VMs gibt. Was ist der richtige Weg, dies zu tun?

+0

Haben Sie versuchen Sie Back-End-Subnetz zu der Vorlage hinzufügen? Ich hatte das gleiche Problem. Wie ich verstanden habe, muss das VNET alle Subnetze in die Vorlage einschließen. –

Antwort

1

ARM-Vorlagen sind deklarativ und in Ihrer Vorlage gibt es nur ein einzelnes Subnetz. Wenn Sie diese Vorlage bereitstellen, wird ARM versuchen, sie genau so zu machen, wie Sie sie definiert haben = sie versucht, alle Subnetze in diesem Subnetz zu entfernen, die nicht mit sich selbst definiert sind. Das ist der Grund für Ihren Fehler. ARM versucht, dein VMnet1 zu löschen, und es kann das nicht tun, solange es NICs zugeordnet ist.

die Dokumentation prüfen hier: Deploy resources with Resource Manager templates and Azure PowerShell

Der interessante Teil ist für Sie:

inkrementelle und vollständige Implementierungen

Wenn Ihre Ressourcen bereitstellen, geben Sie, dass der Einsatz entweder eine inkrementelle Update oder ein komplettes Update. Standardmäßig behandelt der Ressourcen-Manager Bereitstellungen als inkrementelle Aktualisierungen für die Ressourcengruppe.

Mit inkrementeller Bereitstellung, Resource Manager:

  • verlassen unverändert Ressourcen, die in der Ressourcengruppe existieren, sind aber nicht in der Vorlage angegeben
  • fügen Ressourcen, die in der Vorlage angegeben werden, sondern tun nicht vorhanden in der Ressourcengruppe
  • werden Ressourcen nicht erneut bereitgestellt, die in der Ressourcengruppe in derselben in der Vorlage definierten Bedingung vorhanden sind
  • reprovisions vorhandene Ressourcen, die Einstellungen in der Vorlage

Mit vollständiger Implementierung, Resource Manager aktualisiert:

  • löschen Ressourcen, die in der Ressourcengruppe existieren, sind aber in der keine Angabe Vorlage
  • fügt Ressourcen hinzu, die in der Vorlage angegeben sind, aber in der Ressource nicht vorhanden sind
  • Gruppe
  • nicht Ressourcen reprovision, die in der gleichen Bedingung in der Ressourcengruppe gibt es in der Vorlage definiert
  • reprovisions vorhandene Ressourcen, die Sie Einstellungen in der Vorlage

zu lösen Ihr Problem aktualisiert Sie müssen entweder die Subnetzkonfiguration genau auf Ihre vorhandene Konfiguration stellen oder manuell das neue Subnetz erstellen und das Vnet nicht in Ihrer Vorlage definieren.

Wenn Sie das Subnetz manuell erstellen können Sie Ihre vorhandenen vnet und Subnetz in der Vorlage wie diese Referenz:

"parameters": { 
    "existingVirtualNetworkName": { 
     "type": "string" 
    }, 
    "existingVirtualNetworkResourceGroup": { 
     "type": "string" 
    }, 
    "existingSubnet1Name": { 
     "type": "string" 
    }, 
    "existingSubnet2Name": { 
     "type": "string" 
    }, 
} 
"variables": { 
    "existingVnetID": "[resourceId(parameters('existingVirtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks', parameters('existingVirtualNetworkName'))]", 
    "existingSubnet1Ref": "[concat(variables('existingVnetID'),'/subnets/', parameters('existingSubnet1Name'))]", 
    "existingSubnet2Ref": "[concat(variables('existingVnetID'),'/subnets/', parameters('existingSubnet2Name'))]", 
} 

Nach dem bestehenden RessourceGroup vorbei, Vnet und Subnetnames durch Parameter können Sie nur die Variablen „existingSubnet1Name "um auf die richtigen IDs zu zeigen.

Die Magie liegt bei den optionalen Funktionen der [resourceId()] Funktionen: [subscriptionId], [resourceGroupName].

resourceId ([subscriptionId], [resourceGroupName], resourceType, resourceName1, [resourceName2]...) 

Dokumentation: Template functions

Verwandte Themen