@@ -0,0 +1,7 @@ | |||
terraform.tfvars | |||
*.tfplan | |||
.terraform | |||
*.tfstate* | |||
*.swp | |||
*.bak | |||
private.key |
@@ -0,0 +1,70 @@ | |||
# Terraform setup for DigitalOcean | |||
This is a teraform setup for my LPI Labs. The servers are deployed on DigitalOcean. The DNS is automatically updated with the server names. | |||
## Prerequisites | |||
* Install *Terraform* on your local host: | |||
``` | |||
$ wget https://releases.hashicorp.com/terraform/0.11.7/terraform_0.11.7_linux_amd64.zip | |||
$ unzip terraform_0.11.7_linux_amd64.zip | |||
$ sudo cp terraform /usr/local/bin | |||
``` | |||
## Instructions | |||
* Get the repo | |||
``` | |||
$ git clone https://git.theo-andreou.org/Personal/lpi-deploy-digitalocean.git | |||
$ cd terraform-scaleway | |||
``` | |||
* Copy the *terraform.tfvars.example* to *terraform.tfvars* and setup your settings: | |||
``` | |||
do_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" | |||
domain = "example.org" | |||
count = 14 | |||
server_name = { | |||
"debian" = "lpi-deb" | |||
"centos" = "lpi-centos" | |||
} | |||
images = { | |||
"debian" = "debian-9-x64" | |||
"centos" = "centos-7-x64" | |||
} | |||
ssh_keys = [ | |||
"xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx", | |||
] | |||
dns_server = "ns1.example.org" | |||
dns_key_name = "control.ns1.example.org" | |||
dns_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxx+xxx==" | |||
``` | |||
* Initialize your *Terraform* environment: | |||
``` | |||
$ terraform init | |||
``` | |||
* Create a *Terraform* plan: | |||
``` | |||
$ terraform plan -out lpi.plan | |||
``` | |||
* Apply the plan: | |||
``` | |||
$ terraform apply "lpi.plan" | |||
``` | |||
## References | |||
* https://www.terraform.io/docs/providers/scaleway/index.html | |||
* https://scaleway.com |
@@ -0,0 +1,92 @@ | |||
provider "digitalocean" { | |||
token = "${var.do_token}" | |||
} | |||
resource "digitalocean_volume" "centos_lpi" { | |||
count = "${var.count}" | |||
name = "${var.server_name["centos"]}-${count.index}.vol" | |||
region = "${var.region}" | |||
size = 20 | |||
description = "Empty Volume" | |||
} | |||
resource "digitalocean_droplet" "centos_lpi" { | |||
count = "${var.count}" | |||
name = "${var.server_name["centos"]}-${count.index}.${var.domain}" | |||
image = "${var.images["centos"]}" | |||
size = "${var.size}" | |||
region = "${var.region}" | |||
ssh_keys = "${var.ssh_keys}" | |||
volume_ids = ["${element(digitalocean_volume.centos_lpi.*.id, count.index)}"] | |||
} | |||
resource "digitalocean_volume" "debian_lpi" { | |||
count = "${var.count}" | |||
name = "${var.server_name["debian"]}-${count.index}.vol" | |||
region = "${var.region}" | |||
size = 20 | |||
description = "Empty Volume" | |||
} | |||
resource "digitalocean_droplet" "debian_lpi" { | |||
count = "${var.count}" | |||
name = "${var.server_name["debian"]}-${count.index}.${var.domain}" | |||
image = "${var.images["debian"]}" | |||
size = "${var.size}" | |||
region = "${var.region}" | |||
ssh_keys = "${var.ssh_keys}" | |||
volume_ids = ["${element(digitalocean_volume.debian_lpi.*.id, count.index)}"] | |||
} | |||
provider "dns" { | |||
update { | |||
server = "${var.dns_server}" | |||
key_name = "${var.dns_key_name}" | |||
key_algorithm = "hmac-sha512" | |||
key_secret = "${var.dns_key}" | |||
} | |||
} | |||
resource "dns_a_record_set" "centos_lpi" { | |||
count = "${var.count}" | |||
zone = "${var.domain}." | |||
name = "${var.server_name["centos"]}-${count.index}" | |||
addresses = ["${element(digitalocean_droplet.centos_lpi.*.ipv4_address, count.index)}"] | |||
ttl = 300 | |||
provisioner "remote-exec" { | |||
inline = [ | |||
"rndc sync -clean", | |||
] | |||
connection { | |||
type = "ssh" | |||
host = "${var.dns_server}" | |||
user = "root" | |||
port = "3347" | |||
private_key = "${file("private.key")}" | |||
} | |||
} | |||
} | |||
resource "dns_a_record_set" "debian_lpi" { | |||
count = "${var.count}" | |||
zone = "${var.domain}." | |||
name = "${var.server_name["debian"]}-${count.index}" | |||
addresses = ["${element(digitalocean_droplet.debian_lpi.*.ipv4_address, count.index)}"] | |||
ttl = 300 | |||
provisioner "remote-exec" { | |||
inline = [ | |||
"rndc sync -clean", | |||
] | |||
connection { | |||
type = "ssh" | |||
host = "${var.dns_server}" | |||
user = "root" | |||
port = "3347" | |||
private_key = "${file("private.key")}" | |||
} | |||
} | |||
} |
@@ -0,0 +1,21 @@ | |||
do_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" | |||
domain = "example.org" | |||
count = 14 | |||
server_name = { | |||
"debian" = "lpi-deb" | |||
"centos" = "lpi-centos" | |||
} | |||
images = { | |||
"debian" = "debian-9-x64" | |||
"centos" = "centos-7-x64" | |||
} | |||
ssh_keys = [ | |||
"xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx", | |||
] | |||
dns_server = "ns1.example.org" | |||
dns_key_name = "control.ns1.example.org" | |||
dns_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxx+xxx==" |
@@ -0,0 +1,35 @@ | |||
variable "do_token" {} | |||
variable "count" { | |||
default = 11 | |||
} | |||
variable "region" { | |||
default = "lon1" | |||
} | |||
variable "size" { | |||
default = "1gb" | |||
} | |||
variable "server_name" { | |||
type = "map" | |||
} | |||
variable "domain" { | |||
default = "example.com" | |||
} | |||
variable "images" { | |||
type = "map" | |||
} | |||
variable "ssh_keys" { | |||
type = "list" | |||
} | |||
variable "dns_server" {} | |||
variable "dns_key_name" {} | |||
variable "dns_key" {} |