Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .terraform.lock.hcl

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ This Terraform module can be used to create cheap and disposable development mac
## Examples

* [Full-featured development instance on a Scaleway DEV1-S instance running Ubuntu 20.04](examples/ubuntu_dev1-s_full)
* [k3s cluster on 3 Scaleway DEV1-S instances running Debian Buster](examples/debian_dev1-s_k3s)

## Prerequisites

Expand Down
4 changes: 4 additions & 0 deletions cloud-init-user-data
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ runcmd:
- 'apt-get update'
- 'apt-get install -y docker-ce docker-ce-cli containerd.io'
%{endif~}
%{if feature_k3s ~}
# install K3S
- 'curl -sfL https://get.k3s.io | sh -s %{if node_index == "0" ~}server --tls-san ${public_ip} %{else~}agent --server https://${first_public_ip}:6443 %{endif~} --token ${k3s_token}'
%{endif~}
%{if feature_nvm ~}
# install NVM
- 'runuser -l ${user} -c "curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/$(curl -s https://api.github.com/repos/nvm-sh/nvm/releases/latest | jq -r .tag_name)/install.sh | bash"'
Expand Down
76 changes: 76 additions & 0 deletions examples/debian_dev1-s_k3s/.terraform.lock.hcl

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

62 changes: 62 additions & 0 deletions examples/debian_dev1-s_k3s/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Example : k3s cluster on 3 Scaleway DEV1-S instances running Debian Buster

Read the [module documentation](../../README.md) for further explanation.

## Prerequisites

* Terraform 1.0+
* A [Scaleway project](https://console.scaleway.com/project/) (default project is fine but [creating a new one](https://www.scaleway.com/en/docs/scaleway-project/) is encouraged)
* curl, OpenSSH
* [jq](https://stedolan.github.io/jq/) (only for magic commands)

## Introduction

1. Create your SSH key pair and [add the public key in authorized keys of your Scleway project in the Scaleway console](https://console.scaleway.com/project/credentials)

```
ssh-keygen -t rsa -b 4096 -q -C 'scaleway' -N '' -f ~/.ssh/scaleway
```

> if using an existing SSH key, it is assumed its name is *~/.ssh/scaleway*

2. [Retrieve your project credentials](https://console.scaleway.com/project/credentials) and export them:

```
export SCW_DEFAULT_PROJECT_ID=<REDACTED>
export SCW_ACCESS_KEY=<REDACTED>
export SCW_SECRET_KEY=<REDACTED>
export SCW_DEFAULT_REGION=fr-par
export SCW_DEFAULT_ZONE=fr-par-1
```

## Usage

1. Retrieve the (root) Terraform module of this example

```
mkdir debian_dev1-s_k3s
cd debian_dev1-s_k3s
curl -fsSL -O https://raw.githubusercontent.com/debovema/terraform-scaleway-dev-instance/main/examples/debian_dev1-s_k3s/main.tf
```

2. Initialize Terraform

```
terraform init
```

3. Apply default plan
```
terraform apply
```

4. SSH to the (first) created host

```
eval `terraform output --json ssh_commands | jq -r ".[0]"`
```

> To display the SSH command used to connect:
> ```
> echo $(terraform output --json ssh_commands | jq -r ".[0]")
> ```
30 changes: 30 additions & 0 deletions examples/debian_dev1-s_k3s/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
//--------------------------------------------------------------------
// Variables
variable "dev_ssh_key_file" { default = "~/.ssh/scaleway" }
variable "dev_username" { default = "developer" }

//--------------------------------------------------------------------
// Modules
module "dev" {
source = "app.terraform.io/scwdev/dev/scaleway"
version = "0.0.3"

node_count = 3
server_image = "debian_buster"
server_type = "DEV1-S"

feature_k3s = "true"
feature_omz = "true"
ssh_key_file = var.dev_ssh_key_file
username = var.dev_username
}

//--------------------------------------------------------------------
// Outputs
output "public_ips" {
value = module.dev.public_ips
}

output "ssh_commands" {
value = module.dev.ssh_commands
}
8 changes: 6 additions & 2 deletions examples/ubuntu_dev1-s_full/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,16 @@ module "dev" {
source = "app.terraform.io/scwdev/dev/scaleway"
version = "0.0.2"

server_image = "ubuntu_focal"
server_type = "DEV1-S"

ssh_key_file = var.dev_ssh_key_file
username = var.dev_username

feature_docker = "true"
feature_nvm = "true"
feature_omz = "true"
feature_sdkman = "true"
ssh_key_file = var.dev_ssh_key_file
username = var.dev_username
}

//--------------------------------------------------------------------
Expand Down
35 changes: 28 additions & 7 deletions main.tf
Original file line number Diff line number Diff line change
@@ -1,27 +1,48 @@
data "template_file" "userdata" {
count = var.node_count
template = file("${path.module}/cloud-init-user-data")

vars = {
distrib = regex("^ubuntu|debian", var.server_image)
user = var.username
node_index = count.index
distrib = regex("^ubuntu|debian", var.server_image)
user = var.username
first_public_ip = scaleway_instance_ip.node_public_ip[0].address
public_ip = scaleway_instance_ip.node_public_ip[count.index].address

feature_docker = var.feature_docker
feature_k3s = var.feature_k3s
k3s_token = var.feature_k3s ? random_password.k3s_token[0].result : ""
feature_nvm = var.feature_nvm
feature_omz = var.feature_omz
feature_sdkman = var.feature_sdkman
}
}

resource "random_password" "k3s_token" {
count = var.feature_k3s ? 1 : 0

length = 32
special = false
upper = false
lower = true
number = true
}

resource "scaleway_instance_ip" "node_public_ip" {
count = var.node_count
}

resource "scaleway_instance_server" "node" {
count = var.node_count

name = "${var.node_name}-${count.index}"

image = var.server_image
type = var.server_type
enable_dynamic_ip = true
image = var.server_image
type = var.server_type
ip_id = scaleway_instance_ip.node_public_ip[count.index].id

# initialization sequence
cloud_init = data.template_file.userdata.rendered
cloud_init = data.template_file.userdata[count.index].rendered
}

resource "null_resource" "wait_for_init" {
Expand All @@ -44,4 +65,4 @@ resource "null_resource" "wait_for_init" {
provisioner "local-exec" {
command = "sleep 80" # wait more than 1 minute for the instance to be rebooted
}
}
}
6 changes: 6 additions & 0 deletions variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@ variable "feature_omz" {
default = false
}

variable "feature_k3s" {
type = bool
description = "Whether to install K3S or not"
default = false
}

variable "feature_docker" {
type = bool
description = "Whether to install Docker or not"
Expand Down