From 606f6dbfad32824887e6bc02c0653012f93a0177 Mon Sep 17 00:00:00 2001 From: gatici Date: Wed, 31 Jan 2024 13:02:48 +0300 Subject: [PATCH] Add the Terraform module Signed-off-by: gatici --- .gitignore | 54 ++++++++++++++++++++++-- terraform/CONTRIBUTING.md | 86 ++++++++++++++++++++++++++++++++++++++ terraform/README.md | 70 +++++++++++++++++++++++++++++++ terraform/main.tf | 13 ++++++ terraform/outputs.tf | 4 ++ terraform/terraform.tf | 11 +++++ terraform/terraform.tfvars | 9 ++++ terraform/variables.tf | 16 +++++++ 8 files changed, 259 insertions(+), 4 deletions(-) create mode 100644 terraform/CONTRIBUTING.md create mode 100644 terraform/README.md create mode 100644 terraform/main.tf create mode 100644 terraform/outputs.tf create mode 100644 terraform/terraform.tf create mode 100644 terraform/terraform.tfvars create mode 100644 terraform/variables.tf diff --git a/.gitignore b/.gitignore index 6c5bfdde6..e84887dfd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,54 @@ -venv/ -build/ -*.charm -.tox/ +*.idea .vscode/ .coverage +.tox/ +venv/ +build/ + +# Python +**/venv/** +*.pyc +.python-version +.mypy_cache/ __pycache__/ *.py[cod] + +# Charmcraft +*.charm + +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sensitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +*.tfvars +*.tfvars.json + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Include override files you do wish to add to version control using negated pattern +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc +.terraform.lock.hcl + diff --git a/terraform/CONTRIBUTING.md b/terraform/CONTRIBUTING.md new file mode 100644 index 000000000..9a421a2f7 --- /dev/null +++ b/terraform/CONTRIBUTING.md @@ -0,0 +1,86 @@ +# Contributing + +## Development environment + +### Prerequisites + +Make sure the following software and tools are installed in the development +environment. + +- `microk8s` +- `juju` +- `terraform` + +### Prepare Development Environment + +Install Microk8s: + +```console +sudo snap install microk8s --channel=1.27-strict/stable +sudo usermod -a -G snap_microk8s $USER +newgrp snap_microk8s +``` + +Enable `storage` plugin for Microk8s: + +```console +sudo microk8s enable hostpath-storage +``` + +Install Juju: + +```console +sudo snap install juju --channel=3.1/stable +``` + +Install Terraform: + +```console +sudo snap install --classic terraform +``` + +Bootstrap the Juju Controller using Microk8s: + +```console +juju bootstrap microk8s +``` + +Add a Juju model: + +```console +juju add model +```` + +### Terraform provider + +The Terraform module uses the Juju provider to provision Juju resources. Please refer to the [Juju provider documentation](https://registry.terraform.io/providers/juju/juju/latest/docs) for more information. + +A Terraform working directory needs to be initialized at the beginning. + +Initialise the provider: + +```console +terraform init +``` + +## Testing + +Terraform CLI provides various ways to do formatting and validation. + +Formats to a canonical format and style: + +```console +terraform fmt +``` + +Check the syntactical validation: + +```console +terraform validate +``` + +Preview the changes: + +```console +terraform plan +``` diff --git a/terraform/README.md b/terraform/README.md new file mode 100644 index 000000000..98f78129b --- /dev/null +++ b/terraform/README.md @@ -0,0 +1,70 @@ +# Mongodb-k8s Terraform Module + +This mongodb-k8s Terraform module aims to deploy the [mongodb-k8s charm](https://charmhub.io/mongodb-k8s?channel=6/edge) via Terraform. + +## Getting Started + +### Prerequisites + +The following software and tools needs to be installed and should be running in the local environment. + +- `microk8s` +- `juju 3.x` +- `terrafom` + +### Deploy the Mongodb-k8s charm using Terraform + +Make sure that `storage` plugin is enabled for Microk8s: + +```console +sudo microk8s enable hostpath-storage +``` + +Add a Juju model: + +```console +juju add model +``` + +Initialise the provider: + +```console +terraform init +``` + +Customize the configuration inputs under `terraform.tfvars` file according to requirement. + +Replace the values in the `terraform.tfvars` file: + +```yaml +# Mandatory Config Options +model_name = "put your model-name here" +``` + +Run Terraform Plan by providing var-file: + +```console +terraform plan -var-file="terraform.tfvars" +``` + +Deploy the resources, skip the approval: + +```console +terraform apply -auto-approve +``` + +### Check the Output + +Run `juju switch ` to switch to the target Juju model and observe the status of the application. + +```console +juju status +``` + +### Clean up + +Remove the application: + +```console +terraform destroy -auto-approve +``` diff --git a/terraform/main.tf b/terraform/main.tf new file mode 100644 index 000000000..72cfbca69 --- /dev/null +++ b/terraform/main.tf @@ -0,0 +1,13 @@ +resource "juju_application" "mongodb-k8s" { + name = "mongodb-k8s" + model = var.model_name + + charm { + name = "mongodb-k8s" + channel = var.channel + base = "ubuntu@22.04" + } + config = var.mongo-config + units = 1 + trust = true +} diff --git a/terraform/outputs.tf b/terraform/outputs.tf new file mode 100644 index 000000000..bb9fd7ba7 --- /dev/null +++ b/terraform/outputs.tf @@ -0,0 +1,4 @@ +output "db_application_name" { + description = "Name of the deployed application." + value = juju_application.mongodb-k8s.name +} \ No newline at end of file diff --git a/terraform/terraform.tf b/terraform/terraform.tf new file mode 100644 index 000000000..545a7bb57 --- /dev/null +++ b/terraform/terraform.tf @@ -0,0 +1,11 @@ +# Copyright 2023 Canonical Ltd. +# See LICENSE file for licensing details. + +terraform { + required_providers { + juju = { + source = "juju/juju" + version = "~> 0.10.1" + } + } +} diff --git a/terraform/terraform.tfvars b/terraform/terraform.tfvars new file mode 100644 index 000000000..33738f3af --- /dev/null +++ b/terraform/terraform.tfvars @@ -0,0 +1,9 @@ +# Mandatory Config Options +model_name = "put your model-name here" + +# Optional Configuration +channel = "put the charm channel here" +mongo-config = { + auto-delete = "put True to remove any relevant databases associated with the relation when a relation is removed" + role = "put role config here as shard, config-server or replication" +} diff --git a/terraform/variables.tf b/terraform/variables.tf new file mode 100644 index 000000000..4794f1702 --- /dev/null +++ b/terraform/variables.tf @@ -0,0 +1,16 @@ +variable "model_name" { + description = "Name of Juju model to deploy application to" + type = string + default = "" +} + +variable "channel" { + description = "The channel to use when deploying a charm " + type = string + default = "6/beta" +} + +variable "mongo-config" { + description = "Additional configuration for the MongoDB" + default = {} +} \ No newline at end of file