IaC Documentation¶
The thothctl document iac command generates comprehensive documentation for Infrastructure as Code (IaC) resources. It supports multiple IaC frameworks including Terraform and Terragrunt, helping teams maintain clear and up-to-date documentation for their infrastructure code.
Command Syntax¶
Options¶
| Option | Description |
|---|---|
--recursive / --no-recursive |
Generate documentation recursively for all modules/components |
--exclude TEXT |
Patterns to exclude from recursive generation |
--config-file PATH |
Custom terraform-docs configuration file |
--suffix TEXT |
Suffix for project root path (terragrunt only) |
--mood [resources\|modules] |
Type of documentation to generate |
-f, --framework [terraform\|terragrunt\|terraform-terragrunt] |
Type of IaC framework to document (required) |
--graph-type [dot\|mermaid] |
Type of dependency graph to generate (terragrunt only, default: dot) |
--help |
Show help message and exit |
Supported Frameworks¶
Terraform¶
Terraform is an open-source infrastructure as code software tool that enables you to safely and predictably create, change, and improve infrastructure.
# Generate documentation for a Terraform module
thothctl document iac -f terraform
# Generate documentation recursively for all Terraform modules
thothctl document iac -f terraform --recursive
Terragrunt¶
Terragrunt is a thin wrapper for Terraform that provides extra tools for working with multiple Terraform modules.
# Generate documentation for a Terragrunt project
thothctl document iac -f terragrunt
# Generate documentation recursively for all Terragrunt modules
thothctl document iac -f terragrunt --recursive
Dependency Graphs¶
Terragrunt projects support automatic dependency graph generation to visualize module relationships.
SVG Graph (Default):
Output: graph.svg - Interactive SVG diagram showing module dependencies
Mermaid Graph:
Output: graph.mmd - Text-based Mermaid diagram with:
- Professional styling with ThothCTL brand colors
- Color-coded nodes by complexity:
- 🟢 Green: Root nodes (no dependencies)
- 🔵 Blue: Normal nodes (1-2 dependencies)
- 🟠Orange: Complex nodes (3+ dependencies)
- Edge labels showing input keys from mock_outputs
- Dependency details in node labels
Example Mermaid Output:
%%{init: {'theme':'base', 'themeVariables': {...}}}%%
graph LR
vpc["<b>vpc</b>"]:::rootNode
sg["<b>security-groups</b><br/><small>📥 vpc: vpc_id, subnet_ids</small>"]:::normalNode
app["<b>app</b><br/><small>📥 vpc: vpc_id<br/>📥 sg: sg_id</small>"]:::normalNode
sg -->|vpc_id, subnet_ids| vpc
app -->|vpc_id| vpc
app -->|sg_id| sg
classDef rootNode fill:#4caf50,stroke:#2e7d32,stroke-width:3px,color:#fff
classDef normalNode fill:#2196f3,stroke:#1565c0,stroke-width:2px,color:#fff
classDef complexNode fill:#ff9800,stroke:#e65100,stroke-width:2px,color:#fff
Mermaid Benefits: - ✅ Text-based (easy to version control and diff) - ✅ Renders in GitHub, GitLab, and documentation sites - ✅ Shows explicit data flow between modules - ✅ Professional appearance for presentations - ✅ Editable without regenerating
Terraform-Terragrunt¶
This option generates documentation for projects that use both Terraform and Terragrunt together.
# Generate documentation for a mixed Terraform-Terragrunt project
thothctl document iac -f terraform-terragrunt
Documentation Types¶
Resources Documentation¶
Generate documentation focused on the resources defined in your IaC code.
Modules Documentation¶
Generate documentation focused on the modules used in your IaC code.
Recursive Documentation¶
The --recursive flag allows you to generate documentation for all modules or components in a project, including nested ones.
# Generate documentation recursively
thothctl document iac -f terraform --recursive
# Exclude certain patterns when generating recursively
thothctl document iac -f terraform --recursive --exclude "**/.terraform/**" --exclude "**/examples/**"
Custom Configuration¶
You can provide a custom configuration file for terraform-docs to customize the generated documentation.
# Use a custom configuration file
thothctl document iac -f terraform --config-file ./terraform-docs.yml
Example terraform-docs.yml configuration:
formatter: markdown table
header-from: main.tf
footer-from: ""
sections:
hide: []
show: []
content: |-
{{ .Header }}
## Usage
Basic usage example:
```hcl
module "example" {
source = "path/to/module"
// Required variables
region = "us-west-2"
// Optional variables
environment = "dev"
}
```
{{ .Requirements }}
{{ .Providers }}
{{ .Modules }}
{{ .Resources }}
{{ .Inputs }}
{{ .Outputs }}
output:
file: "README.md"
mode: replace
Output Examples¶
Terraform Module Documentation¶
The generated documentation for a Terraform module typically includes:
- Module description and usage examples
- Required providers and their versions
- Input variables with descriptions, types, and default values
- Output values with descriptions
- Resources created by the module
- Submodules used by the module
Terragrunt Project Documentation¶
The generated documentation for a Terragrunt project typically includes:
- Project structure and organization
- Module dependencies and relationships
- Input variables and their sources
- Generated Terraform configurations
Integration with Version Control¶
You can integrate the document command with your version control workflow to ensure documentation is always up-to-date:
# Pre-commit hook example
cat > .git/hooks/pre-commit << 'EOF'
#!/bin/bash
echo "Updating documentation..."
thothctl document iac -f terraform --recursive
git add README.md **/README.md
EOF
chmod +x .git/hooks/pre-commit
CI/CD Integration¶
You can also integrate the document command into your CI/CD pipeline:
# GitHub Actions example
name: Update Documentation
on:
push:
branches: [ main ]
paths:
- '**.tf'
- '**.hcl'
jobs:
update-docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install ThothCTL
run: pip install thothctl
- name: Generate Documentation
run: thothctl document iac -f terraform --recursive
- name: Commit updated documentation
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: "docs: Update generated documentation"
file_pattern: "README.md **/README.md"
Best Practices¶
- Keep documentation close to code: Generate documentation in the same directory as your IaC code
- Version control documentation: Include generated documentation in your version control system
- Automate documentation updates: Use pre-commit hooks or CI/CD pipelines to keep documentation up-to-date
- Use consistent formatting: Standardize documentation format across all projects
- Include usage examples: Add examples to help users understand how to use your modules
- Document all variables: Ensure all input variables have clear descriptions
- Update documentation before releases: Always regenerate documentation before creating a new release
- Use Mermaid for presentations: Generate mermaid graphs for architecture documentation and presentations
- Leverage dependency graphs: Use graphs to understand and communicate module relationships
Dependency Graph Examples¶
Simple Stack¶
Structure:
stacks/
├── vpc/
│ └── terragrunt.hcl
└── security-groups/
└── terragrunt.hcl (depends on vpc)
Command:
Result (graph.mmd):
graph LR
vpc["<b>vpc</b>"]:::rootNode
security_groups["<b>security-groups</b><br/><small>📥 vpc: vpc_id, subnet_ids</small>"]:::normalNode
security_groups -->|vpc_id, subnet_ids| vpc
Complex Stack¶
Structure:
stacks/
├── vpc/
├── rds/ (depends on vpc)
├── security-groups/ (depends on vpc)
└── app/ (depends on vpc, rds, security-groups)
Command:
Result: Multi-level dependency graph with color-coded complexity
From Subdirectory¶
When running from a subdirectory, the graph shows relative paths:
Result: Shows app and its dependencies like ..vpc, ..rds