terraform-module-library — скилл для Claude: модули Terraform
Скилл для написания переиспользуемых модулей Terraform под AWS, Azure, GCP и OCI. Пригодится, когда нужно навести порядок в облачном провижининге.
/plugin marketplace add wshobson/agents
/plugin install cloud-infrastructure@claude-code-workflowsЧто делает terraform-module-library
Скилл задаёт структуру модуля: main.tf, variables.tf, outputs.tf, versions.tf, папку examples/ и тесты на Terratest. Внутри — готовые шаблоны под VPC, EKS, RDS, S3 для AWS, аналоги для Azure, GCP и OCI. Агент опирается на них, когда вы просите собрать новый модуль или привести существующий к общему виду.
Отдельно прописаны правила: семантическое версионирование, описания у всех переменных, блоки validation для входных значений, закреплённые версии провайдеров, теги на ресурсах. Есть пример композиции, где модуль VPC передаёт vpc_id и private_subnet_ids в модуль RDS.
Ставить стоит тем, кто держит инфраструктуру в Terraform и устал от копипасты между проектами. Если у вас один маленький стек на пару ресурсов, скилл только добавит лишние файлы. Для работы нужен сам Terraform и Go, если планируете гонять тесты.
Какие задачи решает
- собрать переиспользуемый модуль VPC с приватными подсетями
- привести переменные модуля к общему стилю с описаниями и валидацией
- связать модули между собой через outputs
- написать тест Terratest для проверки модуля
- закрепить версии провайдеров в versions.tf
Примеры запросов агенту
- Сделай модуль Terraform для VPC в AWS по шаблону из скилла
- Добавь validation для переменной cidr_block
- Напиши тест Terratest для модуля vpc
Как установить terraform-module-library
1Через маркетплейс плагинов
/plugin marketplace add wshobson/agents/plugin install cloud-infrastructure@claude-code-workflows2Через Skills CLI (Vercel)
npx skills add wshobson/agents --skill terraform-module-library -a claude-code3Вручную: положить файлы
~/.claude/skills/terraform-module-library/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/terraform-module-library/
1Через Skills CLI (Vercel)
npx skills add wshobson/agents --skill terraform-module-library -a codex2Вручную: положить файлы
.agents/skills/terraform-module-library/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add wshobson/agents --skill terraform-module-library -a cursor2Вручную: положить файлы
.cursor/skills/terraform-module-library/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install wshobson/agents terraform-module-library2Вручную: положить файлы
.github/skills/terraform-module-library/SKILL.mdКомандой платформы
gemini skills install https://github.com/wshobson/agents --path plugins/cloud-infrastructure/skills/terraform-module-libraryВручную: положить файлы
.devin/skills/terraform-module-library/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Claude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
Похожие
Вопросы о terraform-module-library
Как установить terraform-module-library в Claude?
Через маркетплейс: /plugin marketplace add wshobson/agents, затем /plugin install cloud-infrastructure@claude-code-workflows. Либо npx skills add wshobson/agents --skill terraform-module-library -a claude-code.
Что делает terraform-module-library?
Даёт агенту шаблоны и правила для сборки модулей Terraform под AWS, Azure, GCP и OCI: структура файлов, валидация переменных, outputs, примеры и тесты.
Какие облака поддерживаются?
AWS, Azure, GCP и OCI. В шаблонах есть VPC, EKS, RDS, S3 и их аналоги у остальных провайдеров.
Исходный текст
SKILL.md · MIT
---
name: terraform-module-library
description: Build reusable Terraform modules for AWS, Azure, GCP, and OCI infrastructure following infrastructure-as-code best practices. Use when creating infrastructure modules, standardizing cloud provisioning, or implementing reusable IaC components.
---
# Terraform Module Library
Production-ready Terraform module patterns for AWS, Azure, GCP, and OCI infrastructure.
## Purpose
Create reusable, well-tested Terraform modules for common cloud infrastructure patterns across multiple cloud providers.
## When to Use
- Build reusable infrastructure components
- Standardize cloud resource provisioning
- Implement infrastructure as code best practices
- Create multi-cloud compatible modules
- Establish organizational Terraform standards
## Module Structure
```
terraform-modules/
├── aws/
│ ├── vpc/
│ ├── eks/
│ ├── rds/
│ └── s3/
├── azure/
│ ├── vnet/
│ ├── aks/
│ └── storage/
├── gcp/
│ ├── vpc/
│ ├── gke/
│ └── cloud-sql/
└── oci/
├── vcn/
├── oke/
└── object-storage/
```
## Standard Module Pattern
```
module-name/
├── main.tf # Main resources
├── variables.tf # Input variables
├── outputs.tf # Output values
├── versions.tf # Provider versions
├── README.md # Documentation
├── examples/ # Usage examples
│ └── complete/
│ ├── main.tf
│ └── variables.tf
└── tests/ # Terratest files
└── module_test.go
```
## AWS VPC Module Example
**main.tf:**
```hcl
resource "aws_vpc" "main" {
cidr_block = var.cidr_block
enable_dns_hostnames = var.enable_dns_hostnames
enable_dns_support = var.enable_dns_support
tags = merge(
{
Name = var.name
},
var.tags
)
}
resource "aws_subnet" "private" {
count = length(var.private_subnet_cidrs)
vpc_id = aws_vpc.main.id
cidr_block = var.private_subnet_cidrs[count.index]
availability_zone = var.availability_zones[count.index]
tags = merge(
{
Name = "${var.name}-private-${count.index + 1}"
Tier = "private"
},
var.tags
)
}
resource "aws_internet_gateway" "main" {
count = var.create_internet_gateway ? 1 : 0
vpc_id = aws_vpc.main.id
tags = merge(
{
Name = "${var.name}-igw"
},
var.tags
)
}
```
**variables.tf:**
```hcl
variable "name" {
description = "Name of the VPC"
type = string
}
variable "cidr_block" {
description = "CIDR block for VPC"
type = string
validation {
condition = can(regex("^([0-9]{1,3}\\.){3}[0-9]{1,3}/[0-9]{1,2}$", var.cidr_block))
error_message = "CIDR block must be valid IPv4 CIDR notation."
}
}
variable "availability_zones" {
description = "List of availability zones"
type = list(string)
}
variable "private_subnet_cidrs" {
description = "CIDR blocks for private subnets"
type = list(string)
default = []
}
variable "enable_dns_hostnames" {
description = "Enable DNS hostnames in VPC"
type = bool
default = true
}
variable "tags" {
description = "Additional tags"
type = map(string)
default = {}
}
```
**outputs.tf:**
```hcl
output "vpc_id" {
description = "ID of the VPC"
value = aws_vpc.main.id
}
output "private_subnet_ids" {
description = "IDs of private subnets"
value = aws_subnet.private[*].id
}
output "vpc_cidr_block" {
description = "CIDR block of VPC"
value = aws_vpc.main.cidr_block
}
```
## Best Practices
1. **Use semantic versioning** for modules
2. **Document all variables** with descriptions
3. **Provide examples** in examples/ directory
4. **Use validation blocks** for input validation
5. **Output important attributes** for module composition
6. **Pin provider versions** in versions.tf
7. **Use locals** for computed values
8. **Implement conditional resources** with count/for_each
9. **Test modules** with Terratest
10. **Tag all resources** consistently
**Reference:** See `references/aws-modules.md` and `references/oci-modules.md`
## Module Composition
```hcl
module "vpc" {
source = "../../modules/aws/vpc"
name = "production"
cidr_block = "10.0.0.0/16"
availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"]
private_subnet_cidrs = [
"10.0.1.0/24",
"10.0.2.0/24",
"10.0.3.0/24"
]
tags = {
Environment = "production"
ManagedBy = "terraform"
}
}
module "rds" {
source = "../../modules/aws/rds"
identifier = "production-db"
engine = "postgres"
engine_version = "15.3"
instance_class = "db.t3.large"
vpc_id = module.vpc.vpc_id
subnet_ids = module.vpc.private_subnet_ids
tags = {
Environment = "production"
}
}
```
## Testing
```go
// tests/vpc_test.go
package test
import (
"testing"
"github.com/gruntwork-io/terratest/modules/terraform"
"github.com/stretchr/testify/assert"
)
func TestVPCModule(t *testing.T) {
terraformOptions := &terraform.Options{
TerraformDir: "../examples/complete",
}
defer terraform.Destroy(t, terraformOptions)
terraform.InitAndApply(t, terraformOptions)
vpcID := terraform.Output(t, terraformOptions, "vpc_id")
assert.NotEmpty(t, vpcID)
}
```
## Related Skills
- `multi-cloud-architecture` - For architectural decisions
- `cost-optimization` - For cost-effective designs
© Seth Hobson · MIT · wshobson/agents