From 0eb6cdca10ce31f1f6e462cb915926b90f47823c Mon Sep 17 00:00:00 2001 From: Benjamin Kircher Date: Wed, 19 Aug 2020 14:23:25 +0200 Subject: [PATCH] Rework examples - Make sure examples use plugin from Terraform Registry and TF 0.13 by giving this preamble: terraform { required_providers { gridscale = { source = "gridscale/gridscale" } } } - Flatten hierarchy and remove trivial examples - List examples and a short summary in README - Make sure every example has it's own README - Make sure all examples actually work --- README.md | 18 ++++-- multi-project/README.md | 2 +- multiple-servers/mainserver.tf | 42 ------------- multiple-servers/webservers.tf | 63 ------------------- .../provisioner => provisioner}/.envrc | 2 +- .../provisioner => provisioner}/.gitignore | 0 .../provisioner => provisioner}/README.md | 4 +- .../provisioner => provisioner}/main.yml | 0 .../provisioner => provisioner}/server.tf | 8 ++- single-server/.envrc | 3 + single-server/README.md | 42 +++++++++++++ single-server/complete/server.tf | 42 ------------- single-server/server-only/server.tf | 7 --- single-server/server.tf | 47 ++++++++++++++ single-server/with-storage/server.tf | 16 ----- 15 files changed, 117 insertions(+), 179 deletions(-) delete mode 100644 multiple-servers/mainserver.tf delete mode 100644 multiple-servers/webservers.tf rename {single-server/provisioner => provisioner}/.envrc (65%) rename {single-server/provisioner => provisioner}/.gitignore (100%) rename {single-server/provisioner => provisioner}/README.md (94%) rename {single-server/provisioner => provisioner}/main.yml (100%) rename {single-server/provisioner => provisioner}/server.tf (93%) create mode 100644 single-server/.envrc create mode 100644 single-server/README.md delete mode 100644 single-server/complete/server.tf delete mode 100644 single-server/server-only/server.tf create mode 100644 single-server/server.tf delete mode 100644 single-server/with-storage/server.tf diff --git a/README.md b/README.md index cfb8048..c17c38d 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,19 @@ -# Terraform configuration examples for gridscale +# Terraform Examples for gridscale -This repository contains configuration files you can use as a starting point for [Terraform](https://www.terraform.io/) on gridscale. We also have some step-by-step guides on how to use these config files in our [tutorials](https://gridscale.io/en/community/tutorials/terraform-ubuntu-einrichten-gridscale/) section. Check them out! +This repository contains small self-contained Terraform projects you can use as a starting point for using [Terraform](https://www.terraform.io/) with gridscale. It showcases how easy it is to manage gridscale resources with Terraform in simple as well as more advanced scenarios. -To use the config files, you'll need an [API token](https://my.gridscale.io/Easy/APIs/) and a [gridscale](https://my.gridscale.io/signup/) account. +To make use of the examples, you will need a [gridscale.io](https://my.gridscale.io/signup/) account and an [API token](https://my.gridscale.io/Easy/APIs/). -After Terraform is up and running, you can navigate to one of the example directories and run `terraform init` and `terraform apply`. You will be prompted to enter your API credentials by Terraform. +## Examples + +- [single-server](single-server/README.md): A simple example that shows how a complete server with attached storage, template selection, and networking can be described in Terraform. +- [provisioner](provisioner/README.md): Shows how to integrate Ansible with Terraform to provision your servers and assign them your Ansible roles. +- [multi-project](multi-project/README.md): Describes how you could get Terraform to work in a multi-project scenario. + +## More + +Check out the provider's [reference documentation](https://registry.terraform.io/providers/gridscale/gridscale/latest/docs) for all Data Sources and Resources, along with a complete list of the arguments they accept. + +We also have an introductory-level guide on how to setup and use Terraform in our [tutorials](https://gridscale.io/en/community/tutorials/terraform-ubuntu-einrichten-gridscale/) section. Check it out. Have fun! diff --git a/multi-project/README.md b/multi-project/README.md index bdd22d0..69e25f3 100644 --- a/multi-project/README.md +++ b/multi-project/README.md @@ -1,4 +1,4 @@ -# Multi-project example +# Multi-project Example This example shows how you can leverage gridscale multi-project feature with Terraform. diff --git a/multiple-servers/mainserver.tf b/multiple-servers/mainserver.tf deleted file mode 100644 index c23d3d0..0000000 --- a/multiple-servers/mainserver.tf +++ /dev/null @@ -1,42 +0,0 @@ -provider "gridscale" { -} - -resource "gridscale_server" "caching-server" { - name = "caching-server" - cores = 1 - memory = 2 - storage { - object_uuid = gridscale_storage.caching-server.id - } - network { - object_uuid = gridscale_network.webserver.id - } - ipv4 = gridscale_ipv4.caching-server.id - power = true -} - -resource "gridscale_storage" "caching-server" { - name = "caching-server" - capacity = 10 - template { - template_uuid = data.gridscale_template.ubuntu.id - sshkeys = [gridscale_sshkey.sshkey.id] - } -} - -resource "gridscale_network" "webserver" { - name = "webserver" -} - -resource "gridscale_ipv4" "caching-server" { -} - -resource "gridscale_sshkey" "sshkey" { - name = "complete-sshkey" - sshkey = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDPYHDe/rzR6tb2y6TI1fnGRbpac9dAb8i1RP1tPS3ulG3BSR5VOSQGUvpy7VB71DH/VTBLWQz4Y4J+r5hDJbuNIvNd8jInCEWKgsqC9oFECBGPmOWEr44p+Hsje70sh6Nj34xYjdi6BBc2S+7/KpFzT0tybQTerGcAwztrESTa7iOsEazr6j+nJyhWXaWvHR1U3rC1cKM4QQWQCQHYhCmVGpdiYcFj3JKYjFXgArryZSz0EetWqw17vePD8BI0xawVIZO0f9RdqJ9eYh1vW/k1Gg30qpuVSADNZDMvgkfJnRD+SLjKJBYRdPx61fsmLm+6eL0NLXYVDmnTElpbRhhD wouter@gridscales-MacBook-Air.local" -} - -data "gridscale_template" "ubuntu" { - name = "Ubuntu 18.04 LTS" -} - diff --git a/multiple-servers/webservers.tf b/multiple-servers/webservers.tf deleted file mode 100644 index c591ed9..0000000 --- a/multiple-servers/webservers.tf +++ /dev/null @@ -1,63 +0,0 @@ -resource "gridscale_server" "webserver1" { - name = "webserver1" - cores = 1 - memory = 1 - storage { - object_uuid = gridscale_storage.webserver1.id - } - network { - object_uuid = gridscale_network.webserver.id - } -} - -resource "gridscale_storage" "webserver1" { - name = "webserver1" - capacity = 10 - template { - template_uuid = data.gridscale_template.ubuntu.id - sshkeys = [gridscale_sshkey.sshkey.id] - } -} - -resource "gridscale_server" "webserver2" { - name = "webserver2" - cores = 1 - memory = 1 - storage { - object_uuid = gridscale_storage.webserver2.id - } - network { - object_uuid = gridscale_network.webserver.id - } -} - -resource "gridscale_storage" "webserver2" { - name = "webserver2" - capacity = 10 - template { - template_uuid = data.gridscale_template.ubuntu.id - sshkeys = [gridscale_sshkey.sshkey.id] - } -} - -resource "gridscale_server" "webserver3" { - name = "webserver3" - cores = 1 - memory = 1 - storage { - object_uuid = gridscale_storage.webserver3.id - } - network { - object_uuid = gridscale_network.webserver.id - } -} - -resource "gridscale_storage" "webserver3" { - name = "webserver3" - capacity = 10 - template { - template_uuid = data.gridscale_template.ubuntu.id - sshkeys = [gridscale_sshkey.sshkey.id] - } -} - diff --git a/single-server/provisioner/.envrc b/provisioner/.envrc similarity index 65% rename from single-server/provisioner/.envrc rename to provisioner/.envrc index be3d522..c1fa7a2 100644 --- a/single-server/provisioner/.envrc +++ b/provisioner/.envrc @@ -1,3 +1,3 @@ -export GRIDSCALE_TOKEN=project-a-api-token +export GRIDSCALE_TOKEN=your-api-token export GRIDSCALE_URL=https://api.gridscale.io export GRIDSCALE_UUID=your-user-id diff --git a/single-server/provisioner/.gitignore b/provisioner/.gitignore similarity index 100% rename from single-server/provisioner/.gitignore rename to provisioner/.gitignore diff --git a/single-server/provisioner/README.md b/provisioner/README.md similarity index 94% rename from single-server/provisioner/README.md rename to provisioner/README.md index d5d4772..876dc4b 100644 --- a/single-server/provisioner/README.md +++ b/provisioner/README.md @@ -8,7 +8,7 @@ Note: You need Ansible installed and in PATH to run this example. As usual, set `GRIDSCALE_TOKEN` and `GRIDSCALE_UUID` environment variables to the values you got from your panel. - $ export GRIDSCALE_TOKEN=project-a-api-token + $ export GRIDSCALE_TOKEN=your-api-token $ export GRIDSCALE_UUID=your-user-id Open `server.tf` and paste your SSH public key where it says `"INSERT KEY"`. Then do @@ -19,7 +19,7 @@ And then do a $ terraform apply -Type `yes` when terraform asks you to. In the end, you should see something like following output in your terminal: +Type `yes` when Terraform asks you to. In the end, you should see something like following output in your terminal: ```raw … diff --git a/single-server/provisioner/main.yml b/provisioner/main.yml similarity index 100% rename from single-server/provisioner/main.yml rename to provisioner/main.yml diff --git a/single-server/provisioner/server.tf b/provisioner/server.tf similarity index 93% rename from single-server/provisioner/server.tf rename to provisioner/server.tf index bb00f9b..9f8bcfc 100644 --- a/single-server/provisioner/server.tf +++ b/provisioner/server.tf @@ -1,4 +1,10 @@ -provider "gridscale" {} +terraform { + required_providers { + gridscale = { + source = "gridscale/gridscale" + } + } +} data "gridscale_public_network" "pubnet" { } diff --git a/single-server/.envrc b/single-server/.envrc new file mode 100644 index 0000000..c1fa7a2 --- /dev/null +++ b/single-server/.envrc @@ -0,0 +1,3 @@ +export GRIDSCALE_TOKEN=your-api-token +export GRIDSCALE_URL=https://api.gridscale.io +export GRIDSCALE_UUID=your-user-id diff --git a/single-server/README.md b/single-server/README.md new file mode 100644 index 0000000..88ab280 --- /dev/null +++ b/single-server/README.md @@ -0,0 +1,42 @@ +# A Simple Server + +This is a simple example that show how to use resources and data sources to create a basic running server. + +## Running the Example + +Set `GRIDSCALE_TOKEN` and `GRIDSCALE_UUID` environment variables to the values you got from your panel. + + $ export GRIDSCALE_TOKEN=your-api-token + $ export GRIDSCALE_UUID=your-user-id + +Open `server.tf` and paste your SSH public key where it says `"INSERT KEY"`. Then do + + $ terraform init + +Note that this will download the gridscale provider plugin to `.terraform/`. + +Let's create the server. Do + + $ terraform apply + +Terraform will now plan the actions it is about to perform. You should see something like: + +```raw +Plan: 5 to add, 0 to change, 0 to destroy. +``` + +Investigate the actions that Terraform is about to perform and type `yes`. After about 30 seconds, Terraform will print + +```raw +Apply complete! Resources: 5 added, 0 changed, 0 destroyed. +``` + +Go ahead and inspect the panel for the newly created objects. When your done, remove all resources again by doing + + $ terraform destroy + +After a few moments, everything is removed again. + +```raw +Destroy complete! Resources: 5 destroyed. +``` diff --git a/single-server/complete/server.tf b/single-server/complete/server.tf deleted file mode 100644 index a8a8246..0000000 --- a/single-server/complete/server.tf +++ /dev/null @@ -1,42 +0,0 @@ -provider "gridscale" { -} - -resource "gridscale_server" "server" { - name = "demo-complete-server" - cores = 1 - memory = 2 - storage { - object_uuid = gridscale_storage.storage.id - } - network { - object_uuid = gridscale_network.network.id - } - ipv4 = gridscale_ipv4.ip.id - power = true -} - -resource "gridscale_storage" "storage" { - name = "demo-complete-storage" - capacity = 10 - template { - template_uuid = data.gridscale_template.ubuntu.id - sshkeys = [gridscale_sshkey.sshkey.id] - } -} - -resource "gridscale_network" "network" { - name = "demo-complete-network" -} - -resource "gridscale_ipv4" "ip" { - name = "demo-complete-ip" -} - -resource "gridscale_sshkey" "sshkey" { - name = "demo-complete-sshkey" - sshkey = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDPYHDe/rzR6tb2y6TI1fnGRbpac9dAb8i1RP1tPS3ulG3BSR5VOSQGUvpy7VB71DH/VTBLWQz4Y4J+r5hDJbuNIvNd8jInCEWKgsqC9oFECBGPmOWEr44p+Hsje70sh6Nj34xYjdi6BBc2S+7/KpFzT0tybQTerGcAwztrESTa7iOsEazr6j+nJyhWXaWvHR1U3rC1cKM4QQWQCQHYhCmVGpdiYcFj3JKYjFXgArryZSz0EetWqw17vePD8BI0xawVIZO0f9RdqJ9eYh1vW/k1Gg30qpuVSADNZDMvgkfJnRD+SLjKJBYRdPx61fsmLm+6eL0NLXYVDmnTElpbRhhD wouter@gridscales-MacBook-Air.local" -} - -data "gridscale_template" "ubuntu" { - name = "Ubuntu 18.04 LTS" -} diff --git a/single-server/server-only/server.tf b/single-server/server-only/server.tf deleted file mode 100644 index 6e3c802..0000000 --- a/single-server/server-only/server.tf +++ /dev/null @@ -1,7 +0,0 @@ -provider "gridscale" {} - -resource "gridscale_server" "simple-server"{ - name = "demo-simple-server" - cores = 1 - memory = 2 -} diff --git a/single-server/server.tf b/single-server/server.tf new file mode 100644 index 0000000..fb4bc95 --- /dev/null +++ b/single-server/server.tf @@ -0,0 +1,47 @@ +terraform { + required_providers { + gridscale = { + source = "gridscale/gridscale" + } + } +} + +resource "gridscale_server" "demo" { + name = "demo" + cores = 1 + memory = 2 + storage { + object_uuid = gridscale_storage.demo.id + } + network { + object_uuid = gridscale_network.demo.id + } + ipv4 = gridscale_ipv4.demo.id + power = true +} + +resource "gridscale_storage" "demo" { + name = "demo" + capacity = 10 + template { + template_uuid = data.gridscale_template.ubuntu.id + sshkeys = [gridscale_sshkey.demo.id] + } +} + +resource "gridscale_network" "demo" { + name = "demo" +} + +resource "gridscale_ipv4" "demo" { + name = "demo" +} + +resource "gridscale_sshkey" "demo" { + name = "demo" + sshkey = "INSERT KEY" +} + +data "gridscale_template" "ubuntu" { + name = "Ubuntu 18.04 LTS" +} diff --git a/single-server/with-storage/server.tf b/single-server/with-storage/server.tf deleted file mode 100644 index 8458cfc..0000000 --- a/single-server/with-storage/server.tf +++ /dev/null @@ -1,16 +0,0 @@ -provider "gridscale" {} - -resource "gridscale_server" "server" { - name = "demo-server" - cores = 1 - memory = 2 - storage { - object_uuid = gridscale_storage.storage.id - } -} - -resource "gridscale_storage" "storage" { - name = "demo-storage" - capacity = 11 -} -