{
   "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion":"1.0.0.0",
   "parameters":{
      "admin-username":{
         "type":"string"
      },
      "ssh-public-key":{
         "type":"string"
      },
      "script-base":{
         "type":"string"
      }
   },
   "variables":{
      "unique-prefix":"[concat(resourceGroup().name, substring(uniquestring(resourceGroup().name), 0, 5))]",
      "storage-prefix":"[concat(variables('unique-prefix'))]",
      "pip-prefix":"pip-",
      "nic-prefix":"nic-",
      "nsg-prefix":"nsg-",
      "vm-prefix":"vm-",
      "vnet-prefix":"vnet-",
      "gateway-prefix":"gateway-",
      "load-balancer-name":"lb-esnodes",
      "names":[
         "alpha",
         "beta",
         "gamma",
         "delta",
         "epsilon",
         "zeta",
         "eta",
         "theta",
         "iota",
         "kappa",
         "lambda",
         "mu",
         "nu",
         "xi",
         "omicron",
         "pi",
         "rho",
         "sigma",
         "tau",
         "upsilon",
         "phi",
         "chi",
         "psi",
         "omega"
      ],
      "ssh-keypath":"[concat('/home/', parameters('admin-username'), '/.ssh/authorized_keys')]",
      "vm-size":"Standard_DS1_v2",
      "locations":[
         "central us",
         "east us",
         "west us"
      ]
   },
   "resources":[
      {
         "comments":"admin machine",
         "type":"Microsoft.Compute/virtualMachines",
         "apiVersion":"2015-06-15",
         "name":"vm-admin",
         "location":"[variables('locations')[0]]",
         "properties":{
            "hardwareProfile":{
               "vmSize":"[variables('vm-size')]"
            },
            "storageProfile":{
               "imageReference":{
                  "publisher":"OpenLogic",
                  "offer":"CentOS",
                  "sku":"7.2",
                  "version":"latest"
               },
               "osDisk":{
                  "name":"admin-boot",
                  "createOption":"FromImage",
                  "vhd":{
                     "uri":"[concat(reference(concat('Microsoft.Storage/storageAccounts/', concat(variables('storage-prefix'), variables('names')[0])), '2015-06-15').primaryEndpoints.blob, 'vhds/admin-boot.vhd')]"
                  },
                  "caching":"ReadWrite"
               }
            },
            "osProfile":{
               "computerName":"admin",
               "adminUsername":"[parameters('admin-username')]",
               "linuxConfiguration":{
                  "disablePasswordAuthentication":true,
                  "ssh":{
                     "publicKeys":[
                        {
                           "path":"[variables('ssh-keypath')]",
                           "keyData":"[parameters('ssh-public-key')]"
                        }
                     ]
                  }
               }
            },
            "networkProfile":{
               "networkInterfaces":[
                  {
                     "id":"[resourceId('Microsoft.Network/networkInterfaces', 'nic-admin')]"
                  }
               ]
            }
         },
         "dependsOn":[
            "[resourceId('Microsoft.Storage/storageAccounts', concat(variables('storage-prefix'), variables('names')[0]))]",
            "[resourceId('Microsoft.Network/networkInterfaces', 'nic-admin')]"
         ]
      },
      {
         "comments":"",
         "type":"Microsoft.Network/networkInterfaces",
         "apiVersion":"2016-03-30",
         "name":"nic-admin",
         "location":"[variables('locations')[0]]",
         "properties":{
            "ipConfigurations":[
               {
                  "name":"ifconfig1",
                  "properties":{
                     "publicIPAddress":{
                        "id":"[resourceId('Microsoft.Network/publicIPAddresses', 'pip-admin')]"
                     },
                     "subnet":{
                        "id":"[concat(resourceId('Microsoft.Network/virtualNetworks', concat('vnet-', variables('names')[0])), '/subnets/subnet02')]"
                     }
                  }
               }
            ],
            "dnsSettings":{
               "dnsServers":[

               ]
            },
            "enableIPForwarding":false,
            "networkSecurityGroup":{
               "id":"[resourceId('Microsoft.Network/networkSecurityGroups', 'nsg-admin')]"
            }
         },
         "dependsOn":[
            "[concat('Microsoft.Network/publicIPAddresses/', 'pip-admin')]",
            "[concat('Microsoft.Network/virtualNetworks/', 'vnet-', variables('names')[0])]",
            "[concat('Microsoft.Network/networkSecurityGroups/', 'nsg-admin')]"
         ]
      },
      {
         "comments":"",
         "type":"Microsoft.Network/networkInterfaces",
         "apiVersion":"2016-03-30",
         "name":"[concat('nic-', variables('names')[copyIndex()])]",
         "copy":{
            "name":"nicCopy",
            "count":"[length(variables('locations'))]"
         },
         "location":"[variables('locations')[copyIndex()]]",
         "properties":{
            "ipConfigurations":[
               {
                  "name":"ifconfig1",
                  "properties":{
                     "publicIPAddress":{
                        "id":"[resourceId('Microsoft.Network/publicIPAddresses', concat('pip-', variables('names')[copyIndex()]))]"
                     },
                     "subnet":{
                        "id":"[concat(resourceId('Microsoft.Network/virtualNetworks', concat('vnet-', variables('names')[copyIndex()])), '/subnets/subnet01')]"
                     }
                  }
               }
            ],
            "dnsSettings":{
               "dnsServers":[

               ]
            },
            "enableIPForwarding":false,
            "networkSecurityGroup":{
               "id":"[resourceId('Microsoft.Network/networkSecurityGroups', concat('nsg-', variables('names')[copyIndex()]))]"
            }
         },
         "dependsOn":[
            "[concat('Microsoft.Network/publicIPAddresses/pip-', variables('names')[copyIndex()])]",
            "[concat('Microsoft.Network/virtualNetworks/vnet-', variables('names')[copyIndex()])]",
            "[concat('Microsoft.Network/networkSecurityGroups/nsg-', variables('names')[copyIndex()])]"
         ]
      },
      {
         "comments":"",
         "type":"Microsoft.Network/networkSecurityGroups",
         "apiVersion":"2016-03-30",
         "name":"nsg-admin",
         "location":"[variables('locations')[0]]",
         "properties":{
            "securityRules":[
               {
                  "name":"default-allow-ssh",
                  "properties":{
                     "protocol":"Tcp",
                     "sourcePortRange":"*",
                     "destinationPortRange":"22",
                     "sourceAddressPrefix":"*",
                     "destinationAddressPrefix":"*",
                     "access":"Allow",
                     "priority":1000,
                     "direction":"Inbound"
                  }
               }
            ]
         }
      },
      {
         "comments":"",
         "type":"Microsoft.Network/networkSecurityGroups",
         "apiVersion":"2016-03-30",
         "name":"[concat('nsg-', variables('names')[copyindex()])]",
         "copy":{
            "name":"nsgCopy",
            "count":"[length(variables('locations'))]"
         },
         "location":"[variables('locations')[copyIndex()]]",
         "properties":{
            "securityRules":[
               {
                  "name":"default-allow-ssh",
                  "properties":{
                     "protocol":"Tcp",
                     "sourcePortRange":"*",
                     "destinationPortRange":"22",
                     "sourceAddressPrefix":"*",
                     "destinationAddressPrefix":"*",
                     "access":"Allow",
                     "priority":1000,
                     "direction":"Inbound"
                  }
               },
               {
                  "name":"es",
                  "properties":{
                     "protocol":"Tcp",
                     "sourcePortRange":"*",
                     "destinationPortRange":"9200",
                     "sourceAddressPrefix":"*",
                     "destinationAddressPrefix":"*",
                     "access":"Allow",
                     "priority":1100,
                     "direction":"Inbound"
                  }
               }
            ]
         }
      },
      {
         "comments":"",
         "type":"Microsoft.Network/publicIPAddresses",
         "apiVersion":"2016-03-30",
         "name":"pip-admin",
         "location":"[variables('locations')[0]]",
         "properties":{
            "publicIPAllocationMethod":"Dynamic",
            "idleTimeoutInMinutes":4,
            "dnsSettings":{
               "domainNameLabel":"[concat(variables('unique-prefix'), '-admin')]"
            }
         }
      },
      {
         "comments":"",
         "type":"Microsoft.Network/publicIPAddresses",
         "apiVersion":"2016-03-30",
         "name":"[concat('pip-', variables('names')[copyindex()])]",
         "copy":{
            "name":"pipCopy",
            "count":"[length(variables('locations'))]"
         },
         "location":"[variables('locations')[copyIndex()]]",
         "properties":{
            "publicIPAllocationMethod":"Dynamic",
            "idleTimeoutInMinutes":4,
            "dnsSettings":{
               "domainNameLabel":"[concat(variables('unique-prefix'), '-', variables('names')[copyindex()])]"
            }
         }
      },
      {
         "comments":"",
         "type":"Microsoft.Network/publicIPAddresses",
         "apiVersion":"2016-03-30",
         "name":"[concat('pip-gateway-', variables('names')[copyindex()])]",
         "copy":{
            "name":"pipCopy",
            "count":"[length(variables('locations'))]"
         },
         "location":"[variables('locations')[copyIndex()]]",
         "properties":{
            "publicIPAllocationMethod":"Dynamic"
         }
      },
      {
         "comments":"",
         "type":"Microsoft.Network/virtualNetworks",
         "name":"[concat('vnet-', variables('names')[copyIndex()])]",
         "apiVersion":"2016-03-30",
         "copy":{
            "name":"vnetCopy",
            "count":"[length(variables('locations'))]"
         },
         "location":"[variables('locations')[copyIndex()]]",
         "properties":{
            "addressSpace":{
               "addressPrefixes":[
                  "[concat('10.', mul(16, add(copyIndex(), 1)), '.0.0/12')]"
               ]
            },
            "subnets":[
               {
                  "name":"subnet01",
                  "properties":{
                     "addressPrefix":"[concat('10.', add(mul(16, add(copyIndex(), 1)), 1), '.0.0/16')]"
                  }
               },
               {
                  "name":"subnet02",
                  "properties":{
                     "addressPrefix":"[concat('10.', add(mul(16, add(copyIndex(), 1)), 2), '.0.0/16')]"
                  }
               },
               {
                  "name":"GatewaySubnet",
                  "properties":{
                     "addressPrefix":"[concat('10.', mul(16, add(copyIndex(), 1)), '.0.', 16,'/28')]"
                  }
               }
            ]
         }
      },
      {
         "comments":"",
         "name":"[concat(variables('storage-prefix'), variables('names')[copyIndex()])]",
         "type":"Microsoft.Storage/storageAccounts",
         "apiVersion":"2016-01-01",
         "copy":{
            "name":"storageCopy",
            "count":"[length(variables('locations'))]"
         },
         "location":"[variables('locations')[copyIndex()]]",
         "sku":{
            "name":"Standard_LRS",
            "tier":"Standard"
         },
         "kind":"Storage"
      },
      {
         "comments":"",
         "type":"Microsoft.Network/virtualNetworkGateways",
         "name":"[concat('gateway-', variables('names')[copyindex()])]",
         "copy":{
            "name":"gatewayCopy",
            "count":"[length(variables('locations'))]"
         },
         "location":"[variables('locations')[copyIndex()]]",
         "apiVersion":"2015-06-15",
         "properties":{
            "ipConfigurations":[
               {
                  "name":"vnetConfig",
                  "properties":{
                     "privateIPAllocationMethod":"Dynamic",
                     "publicIPAddress":{
                        "id":"[resourceId('Microsoft.Network/publicIPAddresses', concat('pip-gateway-', variables('names')[copyindex()]))]"
                     },
                     "subnet":{
                        "id":"[concat(resourceId('Microsoft.Network/virtualNetworks', concat('vnet-', variables('names')[copyIndex()])), '/subnets/GatewaySubnet')]"
                     }
                  }
               }
            ],
            "gatewayType":"Vpn",
            "vpnType":"RouteBased",
            "enableBgp":false
         },
         "dependsOn":[
            "[concat('Microsoft.Network/publicIPAddresses/', 'pip-gateway-', variables('names')[copyIndex()])]",
            "[concat('Microsoft.Network/virtualNetworks/', 'vnet-', variables('names')[copyIndex()])]"
         ]
      },
      {
         "comments":"es node",
         "type":"Microsoft.Compute/virtualMachines",
         "apiVersion":"2015-06-15",
         "name":"[concat('vm-', variables('names')[copyIndex()])]",
         "copy":{
            "name":"vmCopy",
            "count":"[length(variables('locations'))]"
         },
         "location":"[variables('locations')[copyIndex()]]",
         "properties":{
            "hardwareProfile":{
               "vmSize":"[variables('vm-size')]"
            },
            "storageProfile":{
               "imageReference":{
                  "publisher":"OpenLogic",
                  "offer":"CentOS",
                  "sku":"7.2",
                  "version":"latest"
               },
               "osDisk":{
                  "name":"[concat('vm-', variables('names')[copyIndex()], '-boot')]",
                  "createOption":"FromImage",
                  "vhd":{
                     "uri":"[concat(reference(concat('Microsoft.Storage/storageAccounts/', concat(variables('storage-prefix'), variables('names')[copyIndex()])), '2015-06-15').primaryEndpoints.blob, 'vhds/', variables('names')[copyIndex()], '-boot.vhd')]"
                  },
                  "caching":"ReadWrite"
               }
            },
            "osProfile":{
               "computerName":"[variables('names')[copyIndex()]]",
               "adminUsername":"[parameters('admin-username')]",
               "linuxConfiguration":{
                  "disablePasswordAuthentication":true,
                  "ssh":{
                     "publicKeys":[
                        {
                           "path":"[variables('ssh-keypath')]",
                           "keyData":"[parameters('ssh-public-key')]"
                        }
                     ]
                  }
               }
            },
            "networkProfile":{
               "networkInterfaces":[
                  {
                     "id":"[resourceId('Microsoft.Network/networkInterfaces', concat('nic-', variables('names')[copyIndex()]))]"
                  }
               ]
            }
         },
         "dependsOn":[
            "[resourceId('Microsoft.Storage/storageAccounts', concat(variables('storage-prefix'), variables('names')[copyIndex()]))]",
            "[resourceId('Microsoft.Network/networkInterfaces', concat('nic-', variables('names')[copyIndex()]))]"
         ]
      },
      {
         "type":"Microsoft.Compute/virtualMachines/extensions",
         "name":"[concat('vm-', variables('names')[copyindex()], '/script')]",
         "apiVersion":"2015-05-01-preview",
         "location":"[variables('locations')[copyIndex()]]",
         "copy":{
            "name":"scriptCopy",
            "count":"[length(variables('locations'))]"
         },
         "dependsOn":[
            "[concat('vm-', variables('names')[copyindex()])]"
         ],
         "properties":{
            "publisher":"Microsoft.Azure.Extensions",
            "type":"CustomScript",
            "typeHandlerVersion":"2.0",
            "autoUpgradeMinorVersion":true,
            "settings":{
               "fileUris":[
                  "[uri(parameters('script-base'), 'install.sh')]"
               ],
               "commandToExecute":"[concat('sh install.sh ', length(variables('locations')), ' ''', parameters('script-base'), ''' ', variables('names')[copyindex()])]"
            }
         }
      }
   ]
}