#!/usr/bin/env python3 """A simple Terraform wrapper to use variable definition files if they match the workspace name.""" import glob import os import pathlib import subprocess # nosec import sys __version__ = "0.1.0" TF_COMMANDS_TO_MODIFY = ["plan", "console", "import", "refresh"] def get_workspace(): """Return the Terraform workspace.""" proc = subprocess.run( # nosec ["terraform", "workspace", "show"], capture_output=True, check=True, text=True, ) return proc.stdout.strip() def is_debug_set(): """Check if the debug environment variable is set.""" debug = os.getenv("TF_DEBUG", "").lower() return debug in ["1", "true"] def wrapper(): # In case tf was run with no arguments. if len(sys.argv) == 1: os.execlp("terraform", "terraform") # nosec # Build a new argument list. args = sys.argv[:] args[0] = "terraform" # Check if the Terraform command is one that we need to modify (include # tfvars files). If not, execute Terraform with the same arguments. for command in TF_COMMANDS_TO_MODIFY: if command in sys.argv: break else: os.execvp("terraform", args) # nosec # We need to add the var files after the Terraform command (if we add it # before Terraform doesn't accept them) but not at the end (not to modify # other argument that accept optional values). So we add them right after # the Terraform command. command_index = args.index(command) workspace = get_workspace() var_file = pathlib.Path(f"{workspace}.tfvars") var_dir = pathlib.Path(workspace) if var_file.exists() and var_file.is_file(): args.insert(command_index + 1, f"-var-file={var_file}") elif var_dir.exists() and var_dir.is_dir(): for var_file in glob.glob(f"{var_dir}/*.tfvars"): args.insert(command_index + 1, f"-var-file={var_file}") # Print the new argument list to stderr if debugging is enabled. if is_debug_set(): print(args, file=sys.stderr) os.execvp("terraform", args) # nosec if __name__ == "__main__": wrapper()