Skip to main content

Terraform developer tool to extract variables and generate variables.tf files.

Project description

scratch relax tv

Terraform module development tool.

  1. Extract variables from main.tf and generate a variables.tf file
  2. Find missing variables in variables.tf and main.tf based on each other
  3. Generate a module use stub from a variables.tf file
  4. Generate a .env or .tfvars file with variables from main.tf
  5. Generate HCL with template variables corresponding to variables from a Terraform template
  6. Delete extra scratchrelaxtv files

install

pip install scratchrelaxtv

tips

Once installed, you can run scratchrelaxtv by typing either relaxtv or scratchrelaxtv.

Find out more about Terraform workflows and using scratchrelaxtv here.

workflows

Here are two example workflows using scratchrelaxtv.

Original module development:

  1. Write main.tf with whatever variables you need
  2. Run scratchrelaxtv to generate variables.tf
  3. Fill in descriptions, defaults, etc. in variables.tf
  4. Run terraform fmt to prettify everything

Cleanup module:

  1. Run scratchrelaxtv in folder with main.tf and variables.tf to find missing variables
  2. Using -cf option, automatically add missing vars to variables.tf
  3. Fill in descriptions, defaults, etc. in variables.tf for newly added vars
  4. Run terraform fmt to prettify everything

examples

example: generate variables.tf

By default, scratchrelaxtv looks for main.tf and will generate a variables.tf file. (Use the -i to specify a different input file.) Variables will be in the same order in variables.tf as they were in main.tf. You can sort the variables using the -a (ascending) and -d (descending) options. You can also --force to overwrite an existing variables.tf file. Otherwise, scratchrelaxtv will generate new variables.tf files with each run: variables.1.tf, variables.2.tf and so on.

Assume this main.tf:

resource "aws_s3_bucket" "this" {
  count  = var.create_bucket ? 1 : 0
  bucket = var.bucket
  region = var.region
}

Run scratchrelaxtv:

$ relaxtv
2019-04-26 08:02:54,011 - INFO - generating variables file
2019-04-26 08:02:54,011 - INFO - input file: main.tf
2019-04-26 08:02:54,011 - INFO - output file: variables.tf
2019-04-26 08:02:54,011 - INFO - not forcing overwrite of output file
2019-04-26 08:02:54,011 - INFO - not ordering output file

The generated variables.tf:

variable "create_bucket" {
  description = ""
  type        = string
  default     = ""
}

variable "bucket" {
  description = ""
  type        = string
  default     = ""
}

variable "region" {
  description = ""
  type        = string
  default     = ""
}

example: find and fix missing variables

Assume you already have a main.tf and a variables.tf. In this example, the variables.tf is missing the region variable.

main.tf:

resource "aws_s3_bucket" "this" {
  bucket = var.bucket
  region = var.region
}

variables.tf:

variable "bucket" {
  description = "The bucket where the stuff will be stored"
  type        = string
  default     = ""
}

Run scratchrelaxtv to automatically add any missing variables:

$ relaxtv -cf
2019-04-26 08:21:27,289 - INFO - checking for missing variables
2019-04-26 08:21:27,289 - INFO - input file: main.tf
2019-04-26 08:21:27,289 - INFO - output file: variables.tf
2019-04-26 08:21:27,289 - INFO - forcing overwrite of output file
2019-04-26 08:21:27,289 - INFO - not ordering output file
2019-04-26 08:21:27,290 - WARNING - input file main.tf is missing variables:
region

Now, the variables.tf looks like this:

variable "bucket" {
  description = "The bucket where the stuff will be stored"
  type        = string
  default     = ""
}

variable "region" {
  description = ""
  type        = string
  default     = ""
}

example: generate a stub for using the module

By default, when generating a stub, scratchrelaxtv looks for variables.tf.

Assume this variables.tf:

variable "id" {
  description = "The ID of the resource"
  type        = string
  default     = ""
}

variable "bucket" {
  description = "The bucket where the stuff will be stored"
  type        = string
  default     = ""
}

variable "region" {
  description = "The AWS region where the bucket lives"
  type        = string
  default     = ""
}

Run scratchrelaxtv with the module stub option:

$ relaxtv -m
2019-04-26 08:09:27,147 - INFO - generating module usage stub
2019-04-26 08:09:27,147 - INFO - input file: variables.tf
2019-04-26 08:09:27,147 - INFO - output file: modstub.tf
2019-04-26 08:09:27,147 - INFO - not forcing overwrite of output file
2019-04-26 08:09:27,147 - INFO - not ordering output file

The generated modstub.tf:

module "tests2" {
  source = "../tests2"

  providers = {
    aws = "aws"
  }

  id     = local.id
  bucket = local.bucket
  region = local.region
}

example: generate a .tfvars file

By default, when generating a .tfvars file, scratchrelaxtv looks for variables.tf.

Assume this variables.tf:

resource "aws_s3_bucket" "this" {
  bucket = var.bucket
  region = var.region
}

Run scratchrelaxtv with the generate .tfvars and sort-ascending options:

$ relaxtv -ta
2019-06-21 20:01:35,362 - INFO - generating .tfvars file
2019-06-21 20:01:35,362 - INFO - input file: variables.tf
2019-06-21 20:01:35,362 - INFO - output file: terraform.tfvars
2019-06-21 20:01:35,362 - INFO - not forcing overwrite of output file
2019-06-21 20:01:35,362 - INFO - ordering output file ascending

The generated terraform.tfvars file:

bucket = "replace"
region = "replace"

example: generate a .tf file from Terraform template

By default, when using template mode, scratchrelaxtv looks for template.sh. (Use the -i to specify a different input file.)

Assume this template.sh:

#!/bin/bash

build_os="${build_os}"
build_type="${build_type}"

Run scratchrelaxtv with the --template and sort-ascending options:

$ relaxtv -a --template
2019-06-21 20:01:35,362 - INFO - extracting template variables
2019-06-21 20:01:35,362 - INFO - input file: template.sh
2019-06-21 20:01:35,362 - INFO - output file: template_vars.tf
2019-06-21 20:01:35,362 - INFO - not forcing overwrite of output file
2019-06-21 20:01:35,362 - INFO - ordering output file ascending

The generated template_vars.tf file:

locals {
  templates_vars = {
    build_os = "replace"
    build_type = "replace"
  }
}

example: generate a .env (dotenv) file

By default, when generating a .env file, scratchrelaxtv looks for variables.tf. (Use the -i to specify a different input file.)

Assume this variables.tf:

resource "aws_s3_bucket" "this" {
  bucket = var.bucket
  region = var.region
}

Run scratchrelaxtv with the generate .env and sort-ascending options:

$ relaxtv -ea
2019-06-21 20:01:35,362 - INFO - generating .env file
2019-06-21 20:01:35,362 - INFO - input file: variables.tf
2019-06-21 20:01:35,362 - INFO - output file: .env
2019-06-21 20:01:35,362 - INFO - not forcing overwrite of output file
2019-06-21 20:01:35,362 - INFO - ordering output file ascending

The generated .env:

unset "${!TF_VAR_@}"
TF_VAR_bucket=replace
TF_VAR_region=replace

example: remove files

$ relaxtv -r

scratchrelaxtv can also tidy up your directories by removing its own extra generated files. Presumably it will only remove files you no longer need but be careful. This chart shows examples of what would be deleted or not.

NOTE: scratchrelaxtv removes files in the current directory and subdirectories.

Filename Deleted?
variables.tf no
modstub.tf yes
modstub.1.tf yes
variables.1.tf yes
xyz.abc no
variables.a.tf no
variables.43.tf yes
modstub no
modstub..tf no

help

scratchrelaxtv includes help:

$ relaxtv -h
usage: scratchrelaxtv [-h] [-i INPUT] [-o OUTPUT] [-f] [-m] [-n MODNAME] [-r]
                      [-c] [-e] [-t] [--template] [-a | -d]

optional arguments:
  -h, --help            show this help message and exit
  -i INPUT, --input INPUT
                        file to extract vars from
  -o OUTPUT, --output OUTPUT
                        file to write extracted vars to
  -f, --force           overwrite existing out file
  -m, --modstub         generate module usage stub
  -n MODNAME, --modname MODNAME
                        name to use in module stub
  -r, --remove          remove all modstub.tf, variables.#.tf files
  -c, --check           check that all vars are listed
  -e, --env             generate .env with Terraform vars
  -t, --tfvars          generate .tfvars with Terraform vars
  --template            generate .tf from Terraform template vars
  -a, --asc             sort output variables in ascending order
  -d, --desc            sort output variables in descending order

CHANGE LOG

0.6.0 - 2020.05.29

  • Output Terraform 0.12.x variables (variables without "${}")
  • Add feature to extract template variables from templates and generate corresponding HCL

0.5.2 - 2019.07.19

  • Add compatibility with HCL2 / Terraform 0.12.x variables (variables without "${}")
  • Remove feature to automatically set lists default value to an empty list (does not work well with HCL2-style variables)

0.5.0 - 2019.07.02

  • Add feature to generate Terraform variables (.tfvars) file

0.4.0 - 2019.06.21

  • Add feature to generate dot-env (.env) file

0.3.0 - 2019.04.25

  • Add functionality to check existing main.tf and variables.tf for missing variables

0.2.1 - 2019.04.25

  • Fix inconsequential error thrown when removing files

0.2.0 - 2019.04.25

  • Add capability to delete extra working files

0.1.3 - 2019.04.17

  • Add module stub capability

0.1.2 - 2019.04.17

  • Add simple docs

0.1.1 - 2019.04.16

  • Initial working version

0.1.0 - 2019.04.15

  • Initial release!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

scratchrelaxtv-0.6.17.tar.gz (26.7 kB view details)

Uploaded Source

Built Distribution

scratchrelaxtv-0.6.17-py2.py3-none-any.whl (21.0 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file scratchrelaxtv-0.6.17.tar.gz.

File metadata

  • Download URL: scratchrelaxtv-0.6.17.tar.gz
  • Upload date:
  • Size: 26.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.24.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.51.0 CPython/3.6.7

File hashes

Hashes for scratchrelaxtv-0.6.17.tar.gz
Algorithm Hash digest
SHA256 840e1445c757a55c90f4bf0c3103b68e0783283dc486bfad693d91a549637c1e
MD5 fba2121ead656a9194e6cd8cfa9ed7be
BLAKE2b-256 51641c5167a47c2803abe9d666a5cce08893cf5141826ca1cda46a8bc10d40ef

See more details on using hashes here.

File details

Details for the file scratchrelaxtv-0.6.17-py2.py3-none-any.whl.

File metadata

  • Download URL: scratchrelaxtv-0.6.17-py2.py3-none-any.whl
  • Upload date:
  • Size: 21.0 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.24.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.51.0 CPython/3.6.7

File hashes

Hashes for scratchrelaxtv-0.6.17-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 1c717e275b54614adbedef108cb5e626966c3efc0755671633525105294573bc
MD5 a98878c315c773961184fafc91e3d6f8
BLAKE2b-256 2813a9ff74f4aaf75b841032af121a16422b9fdb13b526617b77937432ae9eee

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page