Skip to content

Instantly share code, notes, and snippets.

@smithclay
Created July 19, 2017 19:57
Show Gist options
  • Select an option

  • Save smithclay/2d11c2fc2f4584a87ac97574262f91c9 to your computer and use it in GitHub Desktop.

Select an option

Save smithclay/2d11c2fc2f4584a87ac97574262f91c9 to your computer and use it in GitHub Desktop.

Revisions

  1. smithclay revised this gist Jul 19, 2017. 1 changed file with 0 additions and 1 deletion.
    1 change: 0 additions & 1 deletion aws.tf
    Original file line number Diff line number Diff line change
    @@ -21,7 +21,6 @@ variable "aws_amis" {
    }
    }


    # Specify the provider and access details
    provider "aws" {
    region = "${var.aws_region}"
  2. smithclay created this gist Jul 19, 2017.
    180 changes: 180 additions & 0 deletions aws.tf
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,180 @@
    variable "aws_region" {
    description = "EC2 Region for the VPC"
    default = "us-west-2"
    }

    variable "aws_availability_zones" {
    default = "us-west-2a,us-west-2b,us-west-2c"
    description = "List of availability zones, use AWS CLI to find your "
    }

    # TODO: replace with local file
    variable "aws_key_name" {
    description = "Desired name of AWS key pair"
    default = "cloudrace"
    }

    # Custom AMI Created with Packer
    variable "aws_amis" {
    default = {
    us-west-2 = "ami-7d342804"
    }
    }


    # Specify the provider and access details
    provider "aws" {
    region = "${var.aws_region}"
    }

    # Create a VPC to launch our instances into
    resource "aws_vpc" "default" {
    cidr_block = "10.0.0.0/16"
    enable_dns_hostnames = true
    }

    # Create an internet gateway to give our subnet access to the outside world
    resource "aws_internet_gateway" "default" {
    vpc_id = "${aws_vpc.default.id}"
    }

    # Grant the VPC internet access on its main route table
    resource "aws_route" "internet_access" {
    route_table_id = "${aws_vpc.default.main_route_table_id}"
    destination_cidr_block = "0.0.0.0/0"
    gateway_id = "${aws_internet_gateway.default.id}"
    }

    # Create a subnet to launch our instances into
    resource "aws_subnet" "default" {
    vpc_id = "${aws_vpc.default.id}"
    cidr_block = "10.0.1.0/24"
    map_public_ip_on_launch = true
    }

    resource "aws_security_group" "elb" {
    name = "web_elb_sg"

    vpc_id = "${aws_vpc.default.id}"

    # HTTP access from anywhere
    ingress {
    from_port = 80
    to_port = 80
    protocol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
    }

    # outbound internet access
    egress {
    from_port = 0
    to_port = 0
    protocol = "-1"
    cidr_blocks = ["0.0.0.0/0"]
    }

    # ensure the VPC has an Internet gateway or this step will fail
    depends_on = ["aws_internet_gateway.default"]
    }

    resource "aws_elb" "web_elb" {
    name = "webelb"

    # The same availability zone as our instances
    /*availability_zones = ["${split(",", var.aws_availability_zones)}"]*/
    subnets = ["${aws_subnet.default.id}"]
    security_groups = ["${aws_security_group.elb.id}"]

    listener {
    instance_port = "${var.cloudrace_service_port}"
    instance_protocol = "http"
    lb_port = 80
    lb_protocol = "http"
    }

    health_check {
    healthy_threshold = 2
    unhealthy_threshold = 2
    timeout = 3
    target = "HTTP:${var.cloudrace_service_port}/health"
    interval = 10
    }
    }

    resource "aws_autoscaling_group" "web_asg" {
    #availability_zones = ["${split(",", var.aws_availability_zones)}"]
    name = "web_asg"
    max_size = "3"
    min_size = "1"
    desired_capacity = "${var.instances_count}"
    force_delete = true
    launch_configuration = "${aws_launch_configuration.web_lc.name}"
    load_balancers = ["${aws_elb.web_elb.name}"]

    vpc_zone_identifier = ["${aws_subnet.default.id}"]

    tag {
    key = "Name"
    value = "awsweb_asg"
    propagate_at_launch = "true"
    }
    }

    data "aws_ami" "custom" {
    most_recent = true

    filter {
    name = "name"
    values = ["ubuntu-host-cloudrace*"]
    }
    }

    resource "aws_launch_configuration" "web_lc" {
    name = "web_lc"
    image_id = "${data.aws_ami.custom.image_id}"
    instance_type = "t2.nano"

    # Security group
    security_groups = ["${aws_security_group.default.id}"]
    key_name = "${var.aws_key_name}"
    }

    # Our default security group to access
    # the instances over SSH and HTTP
    resource "aws_security_group" "default" {
    name = "terraform_example_sg"

    vpc_id = "${aws_vpc.default.id}"

    # SSH access from anywhere
    ingress {
    from_port = 22
    to_port = 22
    protocol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
    }

    # HTTP access from anywhere
    ingress {
    from_port = 80
    to_port = 80
    protocol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
    }

    # HTTP access from anywhere
    ingress {
    from_port = "${var.cloudrace_service_port}"
    to_port = "${var.cloudrace_service_port}"
    protocol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
    }

    # outbound internet access
    egress {
    from_port = 0
    to_port = 0
    protocol = "-1"
    cidr_blocks = ["0.0.0.0/0"]
    }
    }
    185 changes: 185 additions & 0 deletions azure.tf
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,185 @@
    variable "azure_subscription_id" {}

    variable "azure_client_id" {}

    variable "azure_client_secret" {}

    variable "azure_tenant_id" {}

    variable "rg_prefix" {
    description = "The shortened abbreviation to represent your resource group that will go on the front of some resources."
    default = "rg"
    }

    variable "hostname" {
    description = "VM name referenced also in storage-related names."
    default = "azweb"
    }

    variable "location" {
    description = "The location/region where the virtual network is created. Changing this forces a new resource to be created."
    default = "westcentralus"
    }

    variable "storage_account_type" {
    description = "Defines the type of storage account to be created. Valid options are Standard_LRS, Standard_ZRS, Standard_GRS, Standard_RAGRS, Premium_LRS. Changing this is sometimes valid - see the Azure documentation for more information on which types of accounts can be converted into other types."
    default = "Standard_LRS"
    }

    variable "image_uri" {
    description = "packer-created VHD for the VM"
    default = "https://tfimages.blob.core.windows.net/system/Microsoft.Compute/Images/images/packer-osDisk.c8c51b67-99b1-43cf-86be-2e550994b6b4.vhd"
    }

    variable "vmss_name" {
    description = "String used as a base for naming resources. Must be 3-61 characters in length and globally unique across Azure. A hash is prepended to this string for some resources, and resource-specific information is appended."
    default = "azweb0"
    }

    variable "vm_size" {
    description = "Specifies the size of the virtual machine."
    default = "Standard_A0"
    }

    variable "admin_username" {
    description = "administrator user name"
    default = "ubuntu"
    }

    variable "admin_password" {
    description = "administrator password (recommended to disable password auth)"
    default = "insert-secure-password-here"
    }

    provider "azurerm" {
    subscription_id = "${var.azure_subscription_id}"
    client_id = "${var.azure_client_id}"
    client_secret = "${var.azure_client_secret}"
    tenant_id = "${var.azure_tenant_id}"
    }

    resource "azurerm_resource_group" "rg" {
    name = "cloudrace_rg"
    location = "${var.location}"
    }

    resource "azurerm_virtual_network" "vnet" {
    name = "${var.rg_prefix}vnet"
    location = "${azurerm_resource_group.rg.location}"
    address_space = ["10.0.0.0/16"]
    resource_group_name = "${azurerm_resource_group.rg.name}"
    }

    resource "azurerm_subnet" "subnet" {
    name = "subnet"
    address_prefix = "10.0.0.0/24"
    resource_group_name = "${azurerm_resource_group.rg.name}"
    virtual_network_name = "${azurerm_virtual_network.vnet.name}"
    }

    resource "azurerm_public_ip" "pip" {
    name = "${var.hostname}-pip"
    location = "${azurerm_resource_group.rg.location}"
    resource_group_name = "${azurerm_resource_group.rg.name}"
    public_ip_address_allocation = "Dynamic"
    domain_name_label = "${var.hostname}"
    }

    resource "azurerm_lb" "weblb" {
    name = "LoadBalancer"
    location = "${azurerm_resource_group.rg.location}"
    resource_group_name = "${azurerm_resource_group.rg.name}"
    depends_on = ["azurerm_public_ip.pip"]

    frontend_ip_configuration {
    name = "LBFrontEnd"
    public_ip_address_id = "${azurerm_public_ip.pip.id}"
    }
    }

    resource "azurerm_lb_backend_address_pool" "backlb" {
    name = "BackEndAddressPool"
    resource_group_name = "${azurerm_resource_group.rg.name}"
    loadbalancer_id = "${azurerm_lb.weblb.id}"
    }

    resource "azurerm_lb_nat_pool" "np" {
    resource_group_name = "${azurerm_resource_group.rg.name}"
    loadbalancer_id = "${azurerm_lb.weblb.id}"
    name = "NATPool"
    protocol = "Tcp"
    frontend_port_start = 50000
    frontend_port_end = 50119
    backend_port = 22
    frontend_ip_configuration_name = "LBFrontEnd"
    }

    resource "azurerm_lb_rule" "web" {
    resource_group_name = "${azurerm_resource_group.rg.name}"
    loadbalancer_id = "${azurerm_lb.weblb.id}"
    name = "LBRule"
    protocol = "Tcp"
    frontend_port = 80
    backend_port = "${var.cloudrace_service_port}"
    backend_address_pool_id = "${azurerm_lb_backend_address_pool.backlb.id}"
    frontend_ip_configuration_name = "LBFrontEnd"
    probe_id = "${azurerm_lb_probe.lb_probe.id}"
    depends_on = ["azurerm_lb_probe.lb_probe", "azurerm_lb_backend_address_pool.backlb"]
    }

    resource "azurerm_lb_probe" "lb_probe" {
    resource_group_name = "${azurerm_resource_group.rg.name}"
    loadbalancer_id = "${azurerm_lb.weblb.id}"
    name = "httpProbe"
    protocol = "Http"
    request_path = "/health"
    port = "${var.cloudrace_service_port}"
    interval_in_seconds = 10
    number_of_probes = 2
    }

    resource "azurerm_virtual_machine_scale_set" "scalesetd" {
    name = "azwebscale"
    location = "${azurerm_resource_group.rg.location}"
    resource_group_name = "${azurerm_resource_group.rg.name}"
    upgrade_policy_mode = "Manual"
    overprovision = true
    depends_on = ["azurerm_lb.weblb", "azurerm_virtual_network.vnet"]

    sku {
    name = "${var.vm_size}"
    tier = "Standard"
    capacity = "${var.instances_count}"
    }

    os_profile {
    computer_name_prefix = "${var.vmss_name}"
    admin_username = "${var.admin_username}"
    admin_password = "${var.admin_password}"
    }

    os_profile_linux_config {
    disable_password_authentication = false
    }

    network_profile {
    name = "${var.hostname}-nic"
    primary = true

    ip_configuration {
    name = "${var.hostname}ipconfig"
    subnet_id = "${azurerm_subnet.subnet.id}"
    load_balancer_backend_address_pool_ids = ["${azurerm_lb_backend_address_pool.backlb.id}"]
    load_balancer_inbound_nat_rules_ids = ["${element(azurerm_lb_nat_pool.np.*.id, count.index)}"]
    }
    }

    storage_profile_os_disk {
    name = "packer-osDisk.247bd425-f041-48cc-acc0-48848e6842e0.vhd"
    caching = "ReadWrite"
    create_option = "FromImage"

    image = "${var.image_uri}"
    os_type = "linux"
    }
    }
    169 changes: 169 additions & 0 deletions google.tf
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,169 @@
    variable "region" {
    default = "us-central1"
    }

    variable "region_zone" {
    default = "us-central1-f"
    }

    variable "project_name" {
    description = "The ID of the Google Cloud project"
    default = "c4-cloud-test"
    }

    # Custom Image created via Packer
    variable "gcp_image_name" {
    description = "image name"
    default = "packer-1500055284"
    }

    variable "credentials_file_path" {
    description = "Path to the JSON file used to describe your account credentials"
    default = "~/.ssh/compute-engine-google.json"
    }

    variable "public_key_path" {
    description = "Path to file containing public key"
    default = "~/.ssh/id_rsa_cloudrace.pub"
    }

    variable "private_key_path" {
    description = "Path to file containing private key"
    default = "~/.ssh/id_rsa_cloudrace"
    }

    provider "google" {
    region = "${var.region}"
    project = "${var.project_name}"
    credentials = "${file("${var.credentials_file_path}")}"
    }

    resource "google_compute_network" "cloudrace-network" {
    name = "cloudrace-network"
    }

    resource "google_compute_subnetwork" "cloudrace-subnet" {
    name = "cloudrace-subnet"

    ip_cidr_range = "10.0.2.0/24"
    network = "${google_compute_network.cloudrace-network.self_link}"
    region = "${var.region}"
    }

    resource "google_compute_firewall" "allow-all-internal" {
    name = "allow-all-10-2-0-0-20"
    network = "${google_compute_network.cloudrace-network.name}"

    allow {
    protocol = "tcp"
    }

    allow {
    protocol = "udp"
    }

    allow {
    protocol = "icmp"
    }

    source_ranges = ["10.0.2.0/24"]
    }

    resource "google_compute_backend_service" "cloudrace_backend" {
    name = "cloudracebackend"

    port_name = "http"
    protocol = "HTTP"
    timeout_sec = 10
    enable_cdn = false

    backend {
    group = "${google_compute_instance_group_manager.cloudrace_webservers.instance_group}"
    }

    health_checks = ["${google_compute_http_health_check.default.self_link}"]
    }

    resource "google_compute_http_health_check" "default" {
    name = "http-test"
    request_path = "/health"
    port = "${var.cloudrace_service_port}"
    timeout_sec = 3
    check_interval_sec = 10
    healthy_threshold = 2
    unhealthy_threshold = 2
    }

    resource "google_compute_instance_group_manager" "cloudrace_webservers" {
    name = "gcpweb"
    instance_template = "${google_compute_instance_template.web_template.self_link}"
    base_instance_name = "gcpweb"
    zone = "${var.region_zone}"
    target_size = "${var.instances_count}"

    named_port {
    name = "http"
    port = "${var.cloudrace_service_port}"
    }
    }

    resource "google_compute_instance_template" "web_template" {
    name = "gcpweb"
    machine_type = "f1-micro"
    region = "${var.region}"

    tags = ["web"]

    disk {
    source_image = "${var.gcp_image_name}"
    auto_delete = true
    boot = true
    }

    network_interface {
    subnetwork = "${google_compute_subnetwork.cloudrace-subnet.name}"
    access_config {
    # Ephemeral
    }
    }

    metadata {
    ssh-keys = "root:${file("${var.public_key_path}")}"
    }
    }

    resource "google_compute_firewall" "allow-ssh-http-icmp" {
    name = "allow-tcp22-tcp80-tcp8080-icmp"
    network = "${google_compute_network.cloudrace-network.name}"

    allow {
    protocol = "tcp"
    ports = ["22", "80", "8080"]
    }

    allow {
    protocol = "icmp"
    }

    source_ranges = ["0.0.0.0/0"]
    target_tags = ["web"]
    }

    resource "google_compute_global_forwarding_rule" "default" {
    name = "tf-www-forwarding-rule"
    target = "${google_compute_target_http_proxy.default.self_link}"
    port_range = "80"
    }


    resource "google_compute_target_http_proxy" "default" {
    name = "test-proxy"
    description = "a description"
    url_map = "${google_compute_url_map.default.self_link}"
    }

    resource "google_compute_url_map" "default" {
    name = "url-map"
    description = "a description"
    default_service = "${google_compute_backend_service.cloudrace_backend.self_link}"
    }