Creating and Managing Templates¶
Templates are a core feature of ThothCTL that enable standardized project creation, component generation, and code reuse across your organization. This document outlines how to create, manage, and use templates with ThothCTL.
Overview¶
ThothCTL's template system allows you to:
- Create standardized project structures for different types of infrastructure code
- Enforce organizational best practices and coding standards
- Accelerate development by providing pre-configured components
- Maintain consistency across projects and teams
- Define project parameters and validation rules through
.thothcf.tomlfiles
Template Types¶
ThothCTL supports several template types:
- Project Templates: Complete project structures fetched from GitHub scaffold repositories
- Component Templates: Reusable infrastructure components defined in
.thothcf.toml - Stack Templates: Templates for creating infrastructure stacks via configuration
Template Placeholder Format¶
ThothCTL uses #{parameter_name}# expressions for parameterization in template files:
# Template
resource "aws_vpc" "main" {
cidr_block = "#{vpc_cidr}#"
tags = {
Name = "#{project}#-vpc"
Environment = "#{environment}#"
}
}
When instantiated, placeholders are replaced with the values provided by the user.
The .thothcf.toml File¶
The .thothcf.toml file is a critical component of every ThothCTL template. It defines:
- Template input parameters and validation rules
- Project structure requirements
- Configuration for ThothCTL integration
For Terraform Projects¶
[thothcf]
project_id = "my-project"
[template_input_parameters.project_name]
template_value = "#{project}#"
condition = "^[a-zA-Z0-9_-]+$"
description = "Project Name"
[template_input_parameters.deployment_region]
template_value = "#{backend_region}#"
condition = "^[a-z]{2}-[a-z]{4,10}-\\d$"
description = "AWS Region"
[template_input_parameters.environment]
template_value = "#{environment}#"
condition = "(dev|qa|stg|test|prod)"
description = "Environment name (dev|qa|stg|test|prod)"
# Project structure definition
[project_structure]
root_files = [".git", ".gitignore", ".pre-commit-config.yaml", "README.md"]
ignore_folders = [".git", ".terraform", "Reports"]
For Terraform Modules¶
[template_input_parameters.module_name]
template_value = "#{ModuleName}#"
condition = "^[a-z_]+$"
description = "Module Name"
[template_input_parameters.description]
template_value = "#{ModuleDescription}#"
condition = "^[a-zA-Z\\s]+$"
description = "Module description"
[[project_structure.folders]]
name = "modules"
mandatory = true
content = ["variables.tf", "main.tf", "outputs.tf", "README.md"]
type = "root"
Creating Templates¶
From an Existing Project¶
The primary way to create a template is by converting a working project:
# Navigate to your project
cd my-terraform-project
# Convert to template
thothctl project convert --make-template --template-project-type terraform
# For Terragrunt projects
thothctl project convert --make-template --template-project-type terraform-terragrunt
This reads [project_properties] from .thothcf.toml, replaces values with #{placeholder}# expressions, and saves the template to ~/.thothcf/<project_name>/.
Setting Up Custom Template Repositories¶
Configure a custom GitHub repository as the scaffold source for a project type:
# Set a custom template URL
thothctl init template --project-type terraform --template-url https://github.com/myorg/custom-terraform.git
Using Templates¶
Creating Projects from Scaffold Templates¶
# Terraform + Terragrunt project (fetches from GitHub scaffold)
thothctl init project --project-name my-infra --project-type terraform-terragrunt
# CDK v2 project with language selection
thothctl init project --project-name my-app --project-type cdkv2 --language python
# Reuse template from VCS (Azure DevOps or GitHub space)
thothctl init project --project-name my-project --project-type terraform --reuse --space my-space
Creating Projects from Local Templates¶
# Create project from a previously saved local template
thothctl project convert --make-project --template-project-type terraform
Creating Components from Project Structure¶
# Create a component based on folder structure rules in .thothcf.toml
thothctl generate component \
--component-type modules \
--component-name networking \
--component-path ./modules
Generating Stacks from Configuration¶
# Generate stacks from a YAML configuration file
thothctl generate stacks --config-file stack-config.yaml
# Create an example config to get started
thothctl generate stacks --create-example
Template Variables and .thothcf.toml Interaction¶
When you use a template, ThothCTL will:
- Parse the
.thothcf.tomlfile to identify required parameters - Prompt for values if not provided via command line
- Validate input against the defined
conditionregex - Replace all occurrences of
#{parameter_name}#in template files
Parameter Validation¶
The .thothcf.toml file includes regex conditions to validate input parameters:
[template_input_parameters.environment]
template_value = "#{environment}#"
condition = "(dev|qa|stg|test|prod)"
description = "Environment name (dev|qa|stg|test|prod)"
If a provided value doesn't match the condition, ThothCTL will show an error and prompt for a valid value.
Managing Templates¶
Storage Locations¶
| Location | Purpose |
|---|---|
~/.thothcf/<project_name>/ |
Saved template files (from --make-template) |
~/.thothcf/.thothcf.toml |
Global template registry with file hashes |
~/.thothcf/.thothctl_templates.toml |
Custom template URL overrides |
Listing Available Templates¶
# Show available templates
thothctl list templates
# Show templates from a specific space
thothctl list templates --space my-space
Upgrading Projects from Templates¶
Keep projects in sync with template updates:
# Check what would change
thothctl project upgrade --dry-run
# Interactive file selection
thothctl project upgrade --interactive
# Force upgrade
thothctl project upgrade --force
Template Integration with Spaces¶
Templates can be associated with specific spaces via VCS providers (GitHub, Azure DevOps):
# Initialize a space
thothctl init space --space-name development
# Create project reusing a template from the space
thothctl init project --project-name my-project --project-type terraform --reuse --space development
Projects created within a space can discover templates from the space's VCS provider.
.thothcf.toml Reference¶
Template Input Parameters Section¶
[template_input_parameters.parameter_name]
template_value = "#{ParameterName}#" # Placeholder in template files
condition = "regex_pattern" # Validation regex
description = "Human-readable prompt" # Shown during parameter input
Project Structure Section¶
[project_structure]
root_files = [".gitignore", "README.md"]
ignore_folders = [".git", ".terraform"]
[[project_structure.folders]]
name = "modules"
mandatory = true
type = "root"
content = ["main.tf", "variables.tf", "outputs.tf"]
Best Practices¶
- Keep parameters meaningful — Use descriptive names and provide helpful descriptions
- Validate strictly — Define specific regex patterns to catch errors early
- Document templates — Include README and architecture docs in your templates
- Version control — Store templates in Git repositories with semantic versioning
- Test conversions — Always test
make-projectafter creating a template - Define structure — Use
[project_structure]to enforce required files and folders