diff --git a/.terraform.lock.hcl b/.terraform.lock.hcl index fde5e4f..8ae7425 100644 --- a/.terraform.lock.hcl +++ b/.terraform.lock.hcl @@ -19,6 +19,24 @@ provider "registry.terraform.io/hashicorp/null" { ] } +provider "registry.terraform.io/hashicorp/random" { + version = "3.1.0" + hashes = [ + "h1:BZMEPucF+pbu9gsPk0G0BHx7YP04+tKdq2MrRDF1EDM=", + "zh:2bbb3339f0643b5daa07480ef4397bd23a79963cc364cdfbb4e86354cb7725bc", + "zh:3cd456047805bf639fbf2c761b1848880ea703a054f76db51852008b11008626", + "zh:4f251b0eda5bb5e3dc26ea4400dba200018213654b69b4a5f96abee815b4f5ff", + "zh:7011332745ea061e517fe1319bd6c75054a314155cb2c1199a5b01fe1889a7e2", + "zh:738ed82858317ccc246691c8b85995bc125ac3b4143043219bd0437adc56c992", + "zh:7dbe52fac7bb21227acd7529b487511c91f4107db9cc4414f50d04ffc3cab427", + "zh:a3a9251fb15f93e4cfc1789800fc2d7414bbc18944ad4c5c98f466e6477c42bc", + "zh:a543ec1a3a8c20635cf374110bd2f87c07374cf2c50617eee2c669b3ceeeaa9f", + "zh:d9ab41d556a48bd7059f0810cf020500635bfc696c9fc3adab5ea8915c1d886b", + "zh:d9e13427a7d011dbd654e591b0337e6074eef8c3b9bb11b2e39eaaf257044fd7", + "zh:f7605bd1437752114baf601bdf6931debe6dc6bfe3006eb7e9bb9080931dca8a", + ] +} + provider "registry.terraform.io/hashicorp/template" { version = "2.2.0" hashes = [ diff --git a/README.md b/README.md index c611ef5..64f152a 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/cloud-init-user-data b/cloud-init-user-data index b59f02e..40cc208 100644 --- a/cloud-init-user-data +++ b/cloud-init-user-data @@ -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"' diff --git a/examples/debian_dev1-s_k3s/.terraform.lock.hcl b/examples/debian_dev1-s_k3s/.terraform.lock.hcl new file mode 100644 index 0000000..1653212 --- /dev/null +++ b/examples/debian_dev1-s_k3s/.terraform.lock.hcl @@ -0,0 +1,76 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/null" { + version = "3.1.0" + hashes = [ + "h1:vpC6bgUQoJ0znqIKVFevOdq+YQw42bRq0u+H3nto8nA=", + "zh:02a1675fd8de126a00460942aaae242e65ca3380b5bb192e8773ef3da9073fd2", + "zh:53e30545ff8926a8e30ad30648991ca8b93b6fa496272cd23b26763c8ee84515", + "zh:5f9200bf708913621d0f6514179d89700e9aa3097c77dac730e8ba6e5901d521", + "zh:9ebf4d9704faba06b3ec7242c773c0fbfe12d62db7d00356d4f55385fc69bfb2", + "zh:a6576c81adc70326e4e1c999c04ad9ca37113a6e925aefab4765e5a5198efa7e", + "zh:a8a42d13346347aff6c63a37cda9b2c6aa5cc384a55b2fe6d6adfa390e609c53", + "zh:c797744d08a5307d50210e0454f91ca4d1c7621c68740441cf4579390452321d", + "zh:cecb6a304046df34c11229f20a80b24b1603960b794d68361a67c5efe58e62b8", + "zh:e1371aa1e502000d9974cfaff5be4cfa02f47b17400005a16f14d2ef30dc2a70", + "zh:fc39cc1fe71234a0b0369d5c5c7f876c71b956d23d7d6f518289737a001ba69b", + "zh:fea4227271ebf7d9e2b61b89ce2328c7262acd9fd190e1fd6d15a591abfa848e", + ] +} + +provider "registry.terraform.io/hashicorp/random" { + version = "3.1.0" + hashes = [ + "h1:BZMEPucF+pbu9gsPk0G0BHx7YP04+tKdq2MrRDF1EDM=", + "zh:2bbb3339f0643b5daa07480ef4397bd23a79963cc364cdfbb4e86354cb7725bc", + "zh:3cd456047805bf639fbf2c761b1848880ea703a054f76db51852008b11008626", + "zh:4f251b0eda5bb5e3dc26ea4400dba200018213654b69b4a5f96abee815b4f5ff", + "zh:7011332745ea061e517fe1319bd6c75054a314155cb2c1199a5b01fe1889a7e2", + "zh:738ed82858317ccc246691c8b85995bc125ac3b4143043219bd0437adc56c992", + "zh:7dbe52fac7bb21227acd7529b487511c91f4107db9cc4414f50d04ffc3cab427", + "zh:a3a9251fb15f93e4cfc1789800fc2d7414bbc18944ad4c5c98f466e6477c42bc", + "zh:a543ec1a3a8c20635cf374110bd2f87c07374cf2c50617eee2c669b3ceeeaa9f", + "zh:d9ab41d556a48bd7059f0810cf020500635bfc696c9fc3adab5ea8915c1d886b", + "zh:d9e13427a7d011dbd654e591b0337e6074eef8c3b9bb11b2e39eaaf257044fd7", + "zh:f7605bd1437752114baf601bdf6931debe6dc6bfe3006eb7e9bb9080931dca8a", + ] +} + +provider "registry.terraform.io/hashicorp/template" { + version = "2.2.0" + hashes = [ + "h1:94qn780bi1qjrbC3uQtjJh3Wkfwd5+tTtJHOb7KTg9w=", + "zh:01702196f0a0492ec07917db7aaa595843d8f171dc195f4c988d2ffca2a06386", + "zh:09aae3da826ba3d7df69efeb25d146a1de0d03e951d35019a0f80e4f58c89b53", + "zh:09ba83c0625b6fe0a954da6fbd0c355ac0b7f07f86c91a2a97849140fea49603", + "zh:0e3a6c8e16f17f19010accd0844187d524580d9fdb0731f675ffcf4afba03d16", + "zh:45f2c594b6f2f34ea663704cc72048b212fe7d16fb4cfd959365fa997228a776", + "zh:77ea3e5a0446784d77114b5e851c970a3dde1e08fa6de38210b8385d7605d451", + "zh:8a154388f3708e3df5a69122a23bdfaf760a523788a5081976b3d5616f7d30ae", + "zh:992843002f2db5a11e626b3fc23dc0c87ad3729b3b3cff08e32ffb3df97edbde", + "zh:ad906f4cebd3ec5e43d5cd6dc8f4c5c9cc3b33d2243c89c5fc18f97f7277b51d", + "zh:c979425ddb256511137ecd093e23283234da0154b7fa8b21c2687182d9aea8b2", + ] +} + +provider "registry.terraform.io/scaleway/scaleway" { + version = "2.1.0" + constraints = "~> 2.0" + hashes = [ + "h1:IfyjOGvS3B9fsA1s4XSr0ajVlufSMq/bbqAX8DODdcY=", + "zh:0de647cba4e5a5973984a0e223aa5b6dc06022a0ed9ddc491d4cc1543d4516f0", + "zh:1400a65eaacab234db4734966e79d8891def0e5b9a10f7bad34efcfd6b42ac78", + "zh:1441133bdae2cbaf34203d831a49c535177533023281e1f884bc699adcdcd94d", + "zh:1d3efd87c78f6ab27e4df189510eb84e0b9f1f4eb0d8c0b983e6795824ceb6b3", + "zh:30db64a0dcc43784062ae09dc2b2741fba657577804e7f130aeca2bed8ee6f8c", + "zh:359d420de3ca104c73acd6a0d84af445ee9d6a2759b7131a4f378e786f8cc027", + "zh:6f6a1781251881309289f4ce2aa4289a8715f33ac50603dcb9beae047450892f", + "zh:731de7d68e140f21004506a3afdf7c1af0e285c986e98c53ebde113deb5d4b94", + "zh:90f4fcdce03b46da0b1da88888d9998a61f2f5f50566f88693bc98bdff9117ff", + "zh:a88b770b34cddf506c0c38c98dd124dc7388c6c1baafe546f60f09ba6a1e5691", + "zh:ae7f8250c07e38e86e15bb4f27de57756d49914ee0146298dd0b6f140380a62c", + "zh:cc3f1ad2cb22e50a578cdda1e02bf94f8ce85cebf691263e4b7da8e864e3195d", + "zh:cfb66ebd80a07f160da683d05c6ce03faa2c3218998eaa2df7b1e745026bd4b8", + ] +} diff --git a/examples/debian_dev1-s_k3s/README.md b/examples/debian_dev1-s_k3s/README.md new file mode 100644 index 0000000..2cb8106 --- /dev/null +++ b/examples/debian_dev1-s_k3s/README.md @@ -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= +export SCW_ACCESS_KEY= +export SCW_SECRET_KEY= +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]") +> ``` \ No newline at end of file diff --git a/examples/debian_dev1-s_k3s/main.tf b/examples/debian_dev1-s_k3s/main.tf new file mode 100644 index 0000000..acc627a --- /dev/null +++ b/examples/debian_dev1-s_k3s/main.tf @@ -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 +} diff --git a/examples/ubuntu_dev1-s_full/main.tf b/examples/ubuntu_dev1-s_full/main.tf index 2e7bb97..5dae76b 100644 --- a/examples/ubuntu_dev1-s_full/main.tf +++ b/examples/ubuntu_dev1-s_full/main.tf @@ -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 } //-------------------------------------------------------------------- diff --git a/main.tf b/main.tf index bcd13e0..02abcb5 100644 --- a/main.tf +++ b/main.tf @@ -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" { @@ -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 } -} \ No newline at end of file +} diff --git a/variables.tf b/variables.tf index ad7b8d0..7bc04f7 100644 --- a/variables.tf +++ b/variables.tf @@ -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"