variable "node-count" { default = 0 } variable "big" { default = false } provider "google" { project = "mitogen-load-testing" region = "europe-west1" zone = "europe-west1-d" } resource "google_compute_instance" "controller" { name = "ansible-controller" machine_type = "${var.big ? "n1-highcpu-32" : "custom-1-1024"}" allow_stopping_for_update = true can_ip_forward = true boot_disk { initialize_params { image = "debian-cloud/debian-9" } } scheduling { preemptible = true automatic_restart = false } network_interface { subnetwork = "${google_compute_subnetwork.loadtest-subnet.self_link}" access_config = {} } provisioner "local-exec" { command = <<-EOF ip=${google_compute_instance.controller.network_interface.0.access_config.0.nat_ip}; ssh-keygen -R $ip; ssh-keyscan $ip >> ~/.ssh/known_hosts; sed -ri -e "s/.*CONTROLLER_IP_HERE.*/ Hostname $ip/" ~/.ssh/config; ansible-playbook -i $ip, controller.yml EOF } } resource "google_compute_network" "loadtest" { name = "loadtest" auto_create_subnetworks = false } resource "google_compute_subnetwork" "loadtest-subnet" { name = "loadtest-subnet" ip_cidr_range = "10.19.0.0/16" network = "${google_compute_network.loadtest.id}" } resource "google_compute_firewall" "allow-all-in" { name = "allow-all-in" network = "${google_compute_network.loadtest.name}" direction = "INGRESS" allow { protocol = "all" } } resource "google_compute_firewall" "allow-all-out" { name = "allow-all-out" network = "${google_compute_network.loadtest.name}" direction = "EGRESS" allow { protocol = "all" } } resource "google_compute_route" "route-nodes-via-controller" { name = "route-nodes-via-controller" dest_range = "0.0.0.0/0" network = "${google_compute_network.loadtest.name}" next_hop_instance = "${google_compute_instance.controller.self_link}" next_hop_instance_zone = "${google_compute_instance.controller.zone}" priority = 800 tags = ["node"] } resource "google_compute_instance_template" "node" { name = "node" tags = ["node"] machine_type = "custom-1-1024" scheduling { preemptible = true automatic_restart = false } disk { source_image = "debian-cloud/debian-9" auto_delete = true boot = true } network_interface { subnetwork = "${google_compute_subnetwork.loadtest-subnet.self_link}" } } # # Compute Engine tops out at 1000 VMs per group # resource "google_compute_instance_group_manager" "nodes-a" { name = "nodes-a" base_instance_name = "node" instance_template = "${google_compute_instance_template.node.self_link}" target_size = "${var.node-count / 4}" } resource "google_compute_instance_group_manager" "nodes-b" { name = "nodes-b" base_instance_name = "node" instance_template = "${google_compute_instance_template.node.self_link}" target_size = "${var.node-count / 4}" } resource "google_compute_instance_group_manager" "nodes-c" { name = "nodes-c" base_instance_name = "node" instance_template = "${google_compute_instance_template.node.self_link}" target_size = "${var.node-count / 4}" } resource "google_compute_instance_group_manager" "nodes-d" { name = "nodes-d" base_instance_name = "node" instance_template = "${google_compute_instance_template.node.self_link}" target_size = "${var.node-count / 4}" }