Initial commit
This commit is contained in:
@@ -0,0 +1,191 @@
|
||||
# =============================================================================
|
||||
# VM with Automatic DNS Registration
|
||||
# =============================================================================
|
||||
# This example demonstrates the complete infrastructure automation workflow:
|
||||
# 1. Create VM in Proxmox (using unified module)
|
||||
# 2. Register IP address in NetBox with DNS name
|
||||
# 3. DNS records automatically created in PowerDNS (via netbox-powerdns-sync plugin)
|
||||
# 4. Ready for Ansible configuration management
|
||||
#
|
||||
# Result: Fully automated infrastructure from VM → DNS → Configuration
|
||||
|
||||
terraform {
|
||||
required_version = ">= 1.0"
|
||||
|
||||
required_providers {
|
||||
proxmox = {
|
||||
source = "bpg/proxmox"
|
||||
version = "~> 0.69"
|
||||
}
|
||||
netbox = {
|
||||
source = "e-breuninger/netbox"
|
||||
version = "~> 5.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# === Proxmox Provider ===
|
||||
provider "proxmox" {
|
||||
endpoint = var.proxmox_endpoint
|
||||
# Credentials from environment:
|
||||
# PROXMOX_VE_API_TOKEN or PROXMOX_VE_USERNAME/PASSWORD
|
||||
}
|
||||
|
||||
# === NetBox Provider ===
|
||||
provider "netbox" {
|
||||
server_url = var.netbox_url
|
||||
api_token = var.netbox_api_token
|
||||
# Or use environment: NETBOX_API_TOKEN
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# Step 1: Create VM in Proxmox
|
||||
# =============================================================================
|
||||
|
||||
module "docker_host" {
|
||||
source = "github.com/basher83/Triangulum-Prime//terraform-bgp-vm?ref=vm/1.0.1"
|
||||
|
||||
# VM Configuration
|
||||
vm_type = "clone"
|
||||
pve_node = var.proxmox_node
|
||||
vm_name = var.vm_name
|
||||
|
||||
# Clone from template
|
||||
src_clone = {
|
||||
datastore_id = "local-lvm"
|
||||
tpl_id = var.template_id
|
||||
}
|
||||
|
||||
# Production-ready resources
|
||||
vm_cpu = {
|
||||
cores = 4 # Docker workload
|
||||
}
|
||||
|
||||
vm_mem = {
|
||||
dedicated = 8192 # 8GB for containers
|
||||
}
|
||||
|
||||
# Disk configuration
|
||||
vm_disk = {
|
||||
scsi0 = {
|
||||
datastore_id = "local-lvm"
|
||||
size = 100 # Larger for Docker images
|
||||
main_disk = true
|
||||
}
|
||||
}
|
||||
|
||||
# Network with VLAN
|
||||
vm_net_ifaces = {
|
||||
net0 = {
|
||||
bridge = var.network_bridge
|
||||
vlan_id = var.vlan_id
|
||||
ipv4_addr = "${var.ip_address}/24"
|
||||
ipv4_gw = var.gateway
|
||||
}
|
||||
}
|
||||
|
||||
# Cloud-init
|
||||
vm_init = {
|
||||
datastore_id = "local-lvm"
|
||||
|
||||
user = {
|
||||
name = "ansible"
|
||||
keys = [var.ssh_public_key]
|
||||
}
|
||||
|
||||
dns = {
|
||||
domain = var.dns_domain
|
||||
servers = [var.dns_server]
|
||||
}
|
||||
}
|
||||
|
||||
# EFI disk
|
||||
vm_efi_disk = {
|
||||
datastore_id = "local-lvm"
|
||||
}
|
||||
|
||||
# Tags for organization
|
||||
vm_tags = ["terraform", "docker-host", "production"]
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# Step 2: Register IP in NetBox with DNS Name
|
||||
# =============================================================================
|
||||
|
||||
resource "netbox_ip_address" "docker_host" {
|
||||
ip_address = "${var.ip_address}/24"
|
||||
dns_name = var.fqdn # e.g., docker-01-nexus.spaceships.work
|
||||
status = "active"
|
||||
description = var.vm_description
|
||||
|
||||
# CRITICAL: This tag triggers automatic DNS sync via netbox-powerdns-sync plugin
|
||||
tags = [
|
||||
"terraform",
|
||||
"production-dns", # ← Matches zone rule in NetBox PowerDNS Sync plugin
|
||||
"docker-host"
|
||||
]
|
||||
|
||||
# Ensure VM is created first
|
||||
depends_on = [module.docker_host]
|
||||
|
||||
lifecycle {
|
||||
# Prevent accidental deletion of IP registration
|
||||
prevent_destroy = false # Set to true for production
|
||||
}
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# Step 3: DNS Records Created Automatically
|
||||
# =============================================================================
|
||||
#
|
||||
# The netbox-powerdns-sync plugin automatically creates:
|
||||
# - A record: docker-01-nexus.spaceships.work → 192.168.1.100
|
||||
# - PTR record: 100.1.168.192.in-addr.arpa → docker-01-nexus.spaceships.work
|
||||
#
|
||||
# No manual DNS configuration needed!
|
||||
#
|
||||
# Verify with:
|
||||
# dig @192.168.3.1 docker-01-nexus.spaceships.work +short
|
||||
# dig @192.168.3.1 -x 192.168.1.100 +short
|
||||
|
||||
# =============================================================================
|
||||
# Outputs
|
||||
# =============================================================================
|
||||
|
||||
output "vm_id" {
|
||||
description = "Proxmox VM ID"
|
||||
value = module.docker_host.vm_id
|
||||
}
|
||||
|
||||
output "vm_name" {
|
||||
description = "VM name"
|
||||
value = module.docker_host.vm_name
|
||||
}
|
||||
|
||||
output "vm_ip" {
|
||||
description = "VM IP address"
|
||||
value = var.ip_address
|
||||
}
|
||||
|
||||
output "fqdn" {
|
||||
description = "Fully qualified domain name (with automatic DNS)"
|
||||
value = var.fqdn
|
||||
}
|
||||
|
||||
output "netbox_ip_id" {
|
||||
description = "NetBox IP address ID"
|
||||
value = netbox_ip_address.docker_host.id
|
||||
}
|
||||
|
||||
output "ssh_command" {
|
||||
description = "SSH command to access the VM"
|
||||
value = "ssh ansible@${var.fqdn}"
|
||||
}
|
||||
|
||||
output "verification_commands" {
|
||||
description = "Commands to verify DNS resolution"
|
||||
value = {
|
||||
forward = "dig @${var.dns_server} ${var.fqdn} +short"
|
||||
reverse = "dig @${var.dns_server} -x ${var.ip_address} +short"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user