2016-10-03 1 views
0

Я пытаюсь развернуть шлюз шлюза Azure для переднего приложения, которое у меня есть на существующих виртуальных машинах, и использовать имена хостов для выбора пула. Я начал с этим шаблоном из мерзавца https://github.com/Azure/azure-quickstart-templates/tree/master/201-application-gateway-multihosting на основании статьи https://github.com/Azure/azure-content/blob/master/articles/application-gateway/application-gateway-multi-site-overview.mdКак развернуть шлюз приложений с виртуальными машинами за ним

Вот доработанный tempate я использовал

{ 
"$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')]" 
         } 
        } 
       } 
      ] 
     } 
    } 
] 
} 

Как вы можете видеть, что я указать GWSubnet1 как подсеть App Gateway. Мои внутренние IP-адреса находятся в подсети VMnet1 в той же виртуальной сети. Когда я развертываю его, он говорит, что он не может удалить VMnet1. VMNet1 косвенно ссылается только на базовый IP-адрес, поэтому зачем его пытаться удалить. GWSubnet1 - неиспользуемая пустая подменю в соответствии с правилами развертывания от Azure.

Если я использую GUI, я могу создать шлюз и выбрать GWSubnet1. Однако с помощью графического интерфейса расширенная функция размещения имени хоста в списке не является опцией и, следовательно, не позволит вам создавать несколько списков, используя один и тот же интерфейс. Я попытался с помощью графического интерфейса пользователя и затем добавление listners через Poweshell (версия 3.0.0) с использованием следующих

$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 

Однако кажется, что произойдет в том, что он не добавляет слушателя он просто изменяет существующий слушателя по умолчанию, создается при создании приложения через GUI. Он делает это независимо от того, какое имя я выбираю в качестве слушателя.

Я знаю, что шаблон развертывания работает, так как я могу создать новую пустую группу ресурсов и развернуть ее там и развернуть. Я просто не могу заставить его развертывать там, где есть существующие виртуальные машины. Каков правильный способ сделать это?

+0

Вы пытаетесь добавить вам бэкэнд подсеть в шаблон? У меня такая же проблема. Насколько я понял, VNET должен включать все подсети в шаблоне. –

ответ

1

Шаблоны ARM являются декларативными, и в вашем шаблоне есть только одна подсеть. Если вы разворачиваете этот шаблон, ARM попытается сделать его точно так, как вы определили = он пытается удалить любые подсети в этой подсети, которые arent определил сам. В этом причина вашей ошибки. ARM пытается удалить ваш VMnet1, и он не может этого сделать, пока он связан с NIC.

Проверьте документацию здесь: Deploy resources with Resource Manager templates and Azure PowerShell

интересная часть для вас:

Нарастающее и полное развертывание

При развертывании имеющихся ресурсов, необходимо указать, что развертывание либо инкрементный обновления или полного обновления. По умолчанию диспетчер ресурсов обрабатывает развертывания в виде дополнительных обновлений для группы ресурсов.

С постепенным развертыванием, Resource Manager:

  • оставляет неизменные ресурсов, которые существуют в группе ресурсов, но не указанные в шаблоне
  • добавляет ресурсов, которые указаны в шаблоне, но сделать не существует в группе ресурсов
  • не рецензирует ресурсы, которые существуют в группе ресурсов в том же условии, что и в шаблоне
  • reprovisions существующие ресурсы, которые изменили параметры в шаблоне

При полном развертывании, Resource Manager:

  • удаляет ресурсы, которые существуют в группе ресурсов, но не указанные в template
  • добавляет ресурсы, указанные в шаблоне, но не существующие в ресурсе группа
  • не повторная ресурсов, которые существуют в группе ресурсов в том же состоянии, определенном в шаблоне
  • reprovisions существующих ресурсов, которые обновленные параметры в шаблоне

Чтобы решить вашу проблему, то вы необходимо либо сделать конфигурацию подсети точно представлять вашу существующую настройку, либо вручную создать новую подсеть и не определять vnet в своем шаблоне.

Если создать подсеть вручную, вы можете ссылаться на существующие VNET и подсети в шаблоне так:

"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'))]", 
} 

После прохождения существующего RessourceGroup, Vnet и Subnetnames через параметры, вы можете просто использовать переменные «existingSubnet1Name «чтобы указать на правильные идентификаторы.

Магия заключается в использовании дополнительных функций [resourceId()]: [subscriptionId], [resourceGroupName].

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

Документация: Template functions

Смежные вопросы