Added example for globaly load balanced scale sets (#14912)

This commit is contained in:
Tim Tharratt 2017-05-29 23:19:04 +01:00 committed by Paul Stack
parent 423bfe0298
commit 40ba1b5487
6 changed files with 404 additions and 0 deletions

View File

@ -0,0 +1,27 @@
# Azure traffic manager with load balanced scale sets
This example shows how to create a load balanced scale set in multiple locations and then geographically load balance these using traffic manager. This example the scale set uses a market place Ubuntu image, this could be customised using an extension or a generalized image created using packer.
This script demonstrates how variable can be passed in and out of reusable modules. You will need to run `terraform get` for terrafrom to get so that modules are pre-processed.
## Keys and variables
To use this you will need to populate the `terraform.tfvars.example` file with your Azure credentials and key. Rename this to `terraform.tfvars` and copy this somewhere private. If you need to generate credentials follow the instructions on the Azure provider documented [here](https://www.terraform.io/docs/providers/azurerm)
You may also want to modify some of the settings in `variables.tf`, DNS names must be unique within an Azure location and globally for traffic management
## To start the script
### Planning
`terraform get`
`terraform plan -var-file="C:\Users\eltimmo\.terraform\keys.tfvars"`
### Apply phase
`terraform apply -var-file="C:\Users\eltimmo\.terraform\keys.tfvars"`
### Destroy
`terraform destroy -var-file="C:\Users\eltimmo\.terraform\keys.tfvars"`

View File

@ -0,0 +1,102 @@
# Provider accounts must be passed
variable "subscription_id" {}
variable "client_id" {}
variable "client_secret" {}
variable "tenant_id" {}
provider "azurerm" {
subscription_id = "${var.subscription_id}"
client_id = "${var.client_id}"
client_secret = "${var.client_secret}"
tenant_id = "${var.tenant_id}"
}
# Create the resource group and assets for first location
module "location01" {
source = "./tf_modules"
location = "${var.location01_location}"
resource_prefix = "${var.location01_resource_prefix}"
webserver_prefix = "${var.location01_webserver_prefix}"
lb_dns_label = "${var.location01_lb_dns_label}"
instance_count = "${var.instance_count}"
instance_vmprofile = "${var.instance_vmprofile}"
image_admin_username = "${var.image_admin_username}"
image_admin_password = "${var.image_admin_password}"
image_publisher = "${var.image_publisher}"
image_offer = "${var.image_offer}"
image_sku = "${var.image_sku}"
image_version = "${var.image_version}"
}
# Create the resource group and assets for second location
module "location02" {
source = "./tf_modules"
location = "${var.location02_location}"
resource_prefix = "${var.location02_resource_prefix}"
webserver_prefix = "${var.location02_webserver_prefix}"
lb_dns_label = "${var.location02_lb_dns_label}"
instance_count = "${var.instance_count}"
instance_vmprofile = "${var.instance_vmprofile}"
image_admin_username = "${var.image_admin_username}"
image_admin_password = "${var.image_admin_password}"
image_publisher = "${var.image_publisher}"
image_offer = "${var.image_offer}"
image_sku = "${var.image_sku}"
image_version = "${var.image_version}"
}
# Create global resource group
resource "azurerm_resource_group" "global_rg" {
name = "global_rg"
location = "${var.global_location}"
}
# Create the traffic manager
resource "azurerm_traffic_manager_profile" "trafficmanagerhttp" {
name = "trafficmanagerhttp"
resource_group_name = "${azurerm_resource_group.global_rg.name}"
traffic_routing_method = "Weighted"
dns_config {
relative_name = "${var.dns_relative_name}"
ttl = 100
}
monitor_config {
protocol = "http"
port = 80
path = "/"
}
}
# Add endpoint mappings to traffic manager, location01
resource "azurerm_traffic_manager_endpoint" "trafficmanagerhttp_01" {
name = "trafficmanagerhttp_ukw"
resource_group_name = "${azurerm_resource_group.global_rg.name}"
profile_name = "${azurerm_traffic_manager_profile.trafficmanagerhttp.name}"
target_resource_id = "${module.location01.webserverpublic_ip_id}"
type = "azureEndpoints"
weight = 100
}
# Add endpoint mappings to traffic manager, location02
resource "azurerm_traffic_manager_endpoint" "trafficmanagerhttp_02" {
name = "trafficmanagerhttp_wus"
resource_group_name = "${azurerm_resource_group.global_rg.name}"
profile_name = "${azurerm_traffic_manager_profile.trafficmanagerhttp.name}"
target_resource_id = "${module.location02.webserverpublic_ip_id}"
type = "azureEndpoints"
weight = 100
}

View File

@ -0,0 +1,7 @@
# Azure provide keys example. This should not be included in your repository for security reasons
# Use terrafrom -var-file="FULLPATH"
subscription_id = ""
client_id = ""
client_secret = ""
tenant_id = ""

View File

@ -0,0 +1,165 @@
variable "location" {}
variable "resource_prefix" {}
variable "webserver_prefix" {}
variable "lb_dns_label" {}
variable "instance_count" {}
variable "instance_vmprofile" {}
variable "image_admin_username" {}
variable "image_admin_password" {}
variable "image_publisher" {}
variable "image_offer" {}
variable "image_sku" {}
variable "image_version" {}
# Create webserver resource group
resource "azurerm_resource_group" "webservers_rg" {
name = "${var.resource_prefix}_rg"
location = "${var.location}"
}
# Create virtual network
resource "azurerm_virtual_network" "webservers_vnet" {
name = "webservers_vnet"
address_space = ["10.1.0.0/24"]
location = "${var.location}"
resource_group_name = "${azurerm_resource_group.webservers_rg.name}"
}
# Create subnet
resource "azurerm_subnet" "webservers_subnet" {
name = "webservers_subnet"
resource_group_name = "${azurerm_resource_group.webservers_rg.name}"
virtual_network_name = "${azurerm_virtual_network.webservers_vnet.name}"
address_prefix = "10.1.0.0/24"
}
# Create a public ip for the location LB
resource "azurerm_public_ip" "webserverpublic_ip" {
name = "${var.resource_prefix}_publicip"
location = "${var.location}"
resource_group_name = "${azurerm_resource_group.webservers_rg.name}"
public_ip_address_allocation = "static"
domain_name_label = "${var.lb_dns_label}"
}
# Create webservers LB
resource "azurerm_lb" "webservers_lb" {
name = "webservers_lb"
location = "${var.location}"
resource_group_name = "${azurerm_resource_group.webservers_rg.name}"
frontend_ip_configuration {
name = "webserverpublic_ip"
public_ip_address_id = "${azurerm_public_ip.webserverpublic_ip.id}"
}
}
# Add the backend for webserver LB
resource "azurerm_lb_backend_address_pool" "webservers_lb_backend" {
name = "webservers_lb_backend"
resource_group_name = "${azurerm_resource_group.webservers_rg.name}"
loadbalancer_id = "${azurerm_lb.webservers_lb.id}"
}
# Create HTTP probe on port 80
resource "azurerm_lb_probe" "httpprobe" {
name = "httpprobe"
resource_group_name = "${azurerm_resource_group.webservers_rg.name}"
loadbalancer_id = "${azurerm_lb.webservers_lb.id}"
protocol = "tcp"
port = 80
}
# Create LB rule for HTTP and add to webserver LB
resource "azurerm_lb_rule" "webservers_lb_http" {
name = "webservers_lb_http"
resource_group_name = "${azurerm_resource_group.webservers_rg.name}"
loadbalancer_id = "${azurerm_lb.webservers_lb.id}"
protocol = "Tcp"
frontend_port = "80"
backend_port = "80"
frontend_ip_configuration_name = "webserverpublic_ip"
probe_id = "${azurerm_lb_probe.httpprobe.id}"
backend_address_pool_id = "${azurerm_lb_backend_address_pool.webservers_lb_backend.id}"
}
# Create storage account
resource "azurerm_storage_account" "webservers_sa" {
name = "${var.resource_prefix}storage"
resource_group_name = "${azurerm_resource_group.webservers_rg.name}"
location = "${var.location}"
account_type = "Standard_LRS"
}
# Create container
resource "azurerm_storage_container" "webservers_ct" {
name = "vhds"
resource_group_name = "${azurerm_resource_group.webservers_rg.name}"
storage_account_name = "${azurerm_storage_account.webservers_sa.name}"
container_access_type = "private"
}
# Configure the scale set using library image
resource "azurerm_virtual_machine_scale_set" "webserver_ss" {
name = "webserver_ss"
location = "${var.location}"
resource_group_name = "${azurerm_resource_group.webservers_rg.name}"
upgrade_policy_mode = "Manual"
sku {
name = "${var.instance_vmprofile}"
tier = "Standard"
capacity = "${var.instance_count}"
}
os_profile {
computer_name_prefix = "${var.webserver_prefix}"
admin_username = "${var.image_admin_username}"
admin_password = "${var.image_admin_password}"
}
os_profile_linux_config {
disable_password_authentication = false
}
network_profile {
name = "web_ss_net_profile"
primary = true
ip_configuration {
name = "web_ss_ip_profile"
subnet_id = "${azurerm_subnet.webservers_subnet.id}"
load_balancer_backend_address_pool_ids = ["${azurerm_lb_backend_address_pool.webservers_lb_backend.id}"]
}
}
storage_profile_os_disk {
name = "osDiskProfile"
caching = "ReadWrite"
create_option = "FromImage"
vhd_containers = ["${azurerm_storage_account.webservers_sa.primary_blob_endpoint}${azurerm_storage_container.webservers_ct.name}"]
}
storage_profile_image_reference {
publisher = "${var.image_publisher}"
offer = "${var.image_offer}"
sku = "${var.image_sku}"
version = "${var.image_version}"
}
extension {
name = "CustomScriptForLinux"
publisher = "Microsoft.OSTCExtensions"
type = "CustomScriptForLinux"
type_handler_version = "1.4"
settings = <<SETTINGS
{
"commandToExecute" : "sudo apt-get -y install apache2"
}
SETTINGS
}
}

View File

@ -0,0 +1,5 @@
# Output public IP ID (Load Balancer) for traffic manager
output "webserverpublic_ip_id" {
value = "${azurerm_public_ip.webserverpublic_ip.id}"
}

View File

@ -0,0 +1,98 @@
# Traffic manager settings
variable "global_location" {
default = "UK West"
description = "Where any global resources will be placed"
}
variable "dns_relative_name" {
default = "azuretfexample"
description = "Relative DNS name for traffic manager"
}
# Location 01 Settings
variable "location01_location" {
default = "UK West"
description = "First location to build"
}
variable "location01_resource_prefix" {
default = "ukwestweb"
description = "Prefix for naming resource group"
}
variable "location01_webserver_prefix" {
default = "ukwwebsvr"
description = "Prefix for naming web servers"
}
variable "location01_lb_dns_label" {
default = "ukwestwebexample"
description = "DNS name label for the locations load balancer"
}
# Location 02 Settings
variable "location02_location" {
default = "West US"
description = "Second location to build"
}
variable "location02_resource_prefix" {
default = "uswestweb"
description = "Prefix for naming resource group"
}
variable "location02_webserver_prefix" {
default = "uswwebsvr"
description = "Prefix for naming web servers"
}
variable "location02_lb_dns_label" {
default = "uswestwebexample"
description = "DNS name label for the locations load balancer"
}
# Scale set and VM settings
variable "instance_count" {
default = "2"
description = "Number of server instances to create in scale set"
}
variable "instance_vmprofile" {
default = "Standard_A1"
description = "VM profile of servers in scale set"
}
# OS Profile
variable "image_admin_username" {
default = "webadmin"
description = "Local admin user name"
}
variable "image_admin_password" {
default = "2nmn39x#3775hh3x9"
description = "Password"
}
# Market place image to use
variable "image_publisher" {
default = "Canonical"
description = "Publisher of market place image"
}
variable "image_offer" {
default = "UbuntuServer"
description = "Market place image name"
}
variable "image_sku" {
default = "16.10"
description = "Market place image SKU"
}
variable "image_version" {
default = "latest"
description = "Market place image version"
}