This commit is contained in:
parent
21feeef318
commit
d03573a6ad
29 changed files with 305 additions and 140 deletions
|
@ -1,22 +0,0 @@
|
|||
# This file is maintained automatically by "terraform init".
|
||||
# Manual edits may be lost in future updates.
|
||||
|
||||
provider "registry.terraform.io/hetznercloud/hcloud" {
|
||||
version = "1.26.0"
|
||||
constraints = "~> 1.26.0"
|
||||
hashes = [
|
||||
"h1:2LLe4UKLS7R+t+tQL1oOFLA8c8/rs3iCfT26LyiQcsk=",
|
||||
"zh:03d7eb722a4ee25774949baace0125392060d0369d4cb9257d7d298ab6ece3ff",
|
||||
"zh:0fed2e63ac4cb6fe6b2a5b6891abf973cb7c1716e487fbabc09216e0ec05e866",
|
||||
"zh:1a84c8c1c8e2d6607de5aa09aa3f9254183cde75a5acc666cca5f4b02a1d290e",
|
||||
"zh:23ac426aa3a0001fb20045dc35569978864f139732f45ab671c64e80123c91a1",
|
||||
"zh:23b78348b24ae3e4679bd90989c999346efd71ee228d17368d5f556f63e5fd06",
|
||||
"zh:2503fe28ac87661af96e7755a7404307000822104ac1abc571271eee46c95ab5",
|
||||
"zh:3fe859b2611d20ed5cd65cc2ec812acf73c7dfb39f2fee45ef99a3896c2662a8",
|
||||
"zh:51ef869ed35d0d8aada35f587c4a64802f1140dc93c40a4e7c9800560143bb1a",
|
||||
"zh:69b93cf4adca465b89da08e4e3b4aaf831821f1fbae68e526c0a292b3cfa463d",
|
||||
"zh:6a4e23c6aa86e3d30240e6e4c97daef3af9ad217be2c6f35300fe1839fdbf8b2",
|
||||
"zh:97a513459692a981a62b4a566c1d736c4a67622d2fbbee3771ec3ea8d576d484",
|
||||
"zh:fec6c07731e23d1dd45015b44747b89c4fee58b5b2560f96d24c7da5a8ecb2ad",
|
||||
]
|
||||
}
|
|
@ -1,41 +0,0 @@
|
|||
resource "hcloud_firewall" "firewall" {
|
||||
name = "${var.project_name}-fw"
|
||||
rule {
|
||||
direction = "in"
|
||||
protocol = "icmp"
|
||||
source_ips = [
|
||||
"0.0.0.0/0",
|
||||
"::/0"
|
||||
]
|
||||
}
|
||||
# SSH
|
||||
rule {
|
||||
direction = "in"
|
||||
protocol = "tcp"
|
||||
port = 22
|
||||
source_ips = [
|
||||
"0.0.0.0/0",
|
||||
"::/0"
|
||||
]
|
||||
}
|
||||
# HTTP
|
||||
rule {
|
||||
direction = "in"
|
||||
protocol = "tcp"
|
||||
port = 80
|
||||
source_ips = [
|
||||
"0.0.0.0/0",
|
||||
"::/0"
|
||||
]
|
||||
}
|
||||
# HTTPS
|
||||
rule {
|
||||
direction = "in"
|
||||
protocol = "tcp"
|
||||
port = 443
|
||||
source_ips = [
|
||||
"0.0.0.0/0",
|
||||
"::/0"
|
||||
]
|
||||
}
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
resource "hcloud_network" "network" {
|
||||
name = "${var.project_name}-vnet"
|
||||
ip_range = "10.0.0.0/16"
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
output "public_ip" {
|
||||
value = hcloud_server.server.ipv4_address
|
||||
}
|
||||
|
||||
output "private_ip" {
|
||||
value = hcloud_server_network.server_network.ip
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
# Set the variable value in *.tfvars file
|
||||
# or using the -var="hcloud_token=..." CLI option
|
||||
variable "hcloud_token" {}
|
||||
|
||||
# Configure the Hetzner Cloud Provider
|
||||
provider "hcloud" {
|
||||
token = var.hcloud_token
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
resource "hcloud_server" "server" {
|
||||
name = "${var.project_name}-vm"
|
||||
server_type = var.server_type
|
||||
image = var.image
|
||||
location = var.location
|
||||
backups = var.backups
|
||||
firewall_ids = [hcloud_firewall.firewall.id]
|
||||
labels = local.labels
|
||||
|
||||
depends_on = [
|
||||
hcloud_network_subnet.network-subnet
|
||||
]
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
resource "hcloud_server_network" "server_network" {
|
||||
server_id = hcloud_server.server.id
|
||||
network_id = hcloud_network.network.id
|
||||
ip = "10.0.1.5"
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
resource "hcloud_network_subnet" "network-subnet" {
|
||||
type = "cloud"
|
||||
network_id = hcloud_network.network.id
|
||||
network_zone = "eu-central"
|
||||
ip_range = "10.0.1.0/24"
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
variable "project_name" {
|
||||
type = string
|
||||
default = "project"
|
||||
}
|
||||
|
||||
variable "server_type" {
|
||||
type = string
|
||||
default = "cx11"
|
||||
}
|
||||
|
||||
variable "image" {
|
||||
type = string
|
||||
default = "debian-10"
|
||||
}
|
||||
|
||||
variable "location" {
|
||||
type = string
|
||||
default = "nbg1"
|
||||
}
|
||||
|
||||
variable "backups" {
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
locals {
|
||||
labels = {
|
||||
"Project" = "${var.project_name}"
|
||||
"Owner" = "Oscar"
|
||||
"Environment" = "Development"
|
||||
}
|
||||
}
|
9
template/hetzner-infra/backend.tf
Normal file
9
template/hetzner-infra/backend.tf
Normal file
|
@ -0,0 +1,9 @@
|
|||
terraform {
|
||||
backend "s3" {
|
||||
region = "main"
|
||||
skip_credentials_validation = true
|
||||
skip_metadata_api_check = true
|
||||
skip_region_validation = true
|
||||
force_path_style = true
|
||||
}
|
||||
}
|
6
template/hetzner-infra/firewall.tf
Normal file
6
template/hetzner-infra/firewall.tf
Normal file
|
@ -0,0 +1,6 @@
|
|||
module "firewall" {
|
||||
source = "./modules/firewall"
|
||||
firewall_name = "fw-${var.project_name}"
|
||||
firewall_service_type = "Basic"
|
||||
firewall_labels = local.common_labels
|
||||
}
|
21
template/hetzner-infra/modules/firewall/firewall.tf
Normal file
21
template/hetzner-infra/modules/firewall/firewall.tf
Normal file
|
@ -0,0 +1,21 @@
|
|||
resource "hcloud_firewall" "firewall" {
|
||||
name = var.firewall_name
|
||||
labels = merge(
|
||||
var.firewall_labels,
|
||||
{
|
||||
"Resource_Type" = "Firewall"
|
||||
"Service_Type" = var.firewall_service_type
|
||||
}
|
||||
)
|
||||
|
||||
dynamic "rule" {
|
||||
for_each = local.rule_set
|
||||
content {
|
||||
description = rule.value["description"]
|
||||
direction = rule.value["direction"]
|
||||
port = rule.value["port"]
|
||||
protocol = rule.value["protocol"]
|
||||
source_ips = rule.value["source_ips"]
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
resource "hcloud_firewall_attachment" "firewall_attachment" {
|
||||
firewall_id = hcloud_firewall.firewall.id
|
||||
label_selectors = ["Service_Type = ${var.firewall_service_type}"]
|
||||
}
|
3
template/hetzner-infra/modules/firewall/outputs.tf
Normal file
3
template/hetzner-infra/modules/firewall/outputs.tf
Normal file
|
@ -0,0 +1,3 @@
|
|||
output "firewall_id" {
|
||||
value = hcloud_firewall.firewall.id
|
||||
}
|
70
template/hetzner-infra/modules/firewall/variables.tf
Normal file
70
template/hetzner-infra/modules/firewall/variables.tf
Normal file
|
@ -0,0 +1,70 @@
|
|||
variable "firewall_labels" {
|
||||
description = "Labels to be associated to resource"
|
||||
type = map(string)
|
||||
}
|
||||
|
||||
variable "firewall_name" {
|
||||
description = "Name of resource"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "firewall_service_type" {
|
||||
description = "The 'Service_Type label the firewall targets"
|
||||
type = string
|
||||
|
||||
}
|
||||
|
||||
# Define individual rules
|
||||
locals {
|
||||
ssh_firewall_rule = {
|
||||
description = "SSH IN"
|
||||
direction = "in"
|
||||
protocol = "tcp"
|
||||
port = 22
|
||||
source_ips = [
|
||||
"0.0.0.0/0",
|
||||
"::/0"
|
||||
]
|
||||
}
|
||||
http_firewall_rule = {
|
||||
description = "HTTP IN"
|
||||
direction = "in"
|
||||
protocol = "tcp"
|
||||
port = 80
|
||||
source_ips = [
|
||||
"0.0.0.0/0",
|
||||
"::/0"
|
||||
]
|
||||
}
|
||||
https_firewall_rule = {
|
||||
description = "HTTPS IN"
|
||||
direction = "in"
|
||||
protocol = "tcp"
|
||||
port = 443
|
||||
source_ips = [
|
||||
"0.0.0.0/0",
|
||||
"::/0"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
# Define rule groups
|
||||
locals {
|
||||
basic_firewall_rules = [local.ssh_firewall_rule]
|
||||
web_firewall_rules = [
|
||||
local.basic_firewall_rules,
|
||||
local.http_firewall_rule,
|
||||
local.https_firewall_rule]
|
||||
}
|
||||
|
||||
# Select rule group based on passed variable
|
||||
locals {
|
||||
rule_set = lookup(
|
||||
{
|
||||
Web = local.web_firewall_rules,
|
||||
Basic = local.basic_firewall_rules
|
||||
},
|
||||
var.firewall_service_type,
|
||||
local.basic_firewall_rules
|
||||
)
|
||||
}
|
|
@ -2,7 +2,7 @@ terraform {
|
|||
required_providers {
|
||||
hcloud = {
|
||||
source = "hetznercloud/hcloud"
|
||||
version = "~> 1.26.0"
|
||||
version = "~> 1.41.0"
|
||||
}
|
||||
}
|
||||
}
|
3
template/hetzner-infra/modules/server/data.tf
Normal file
3
template/hetzner-infra/modules/server/data.tf
Normal file
|
@ -0,0 +1,3 @@
|
|||
data "hcloud_ssh_key" "ansible_provision_key" {
|
||||
name = "Ansible Provisioner"
|
||||
}
|
15
template/hetzner-infra/modules/server/outputs.tf
Normal file
15
template/hetzner-infra/modules/server/outputs.tf
Normal file
|
@ -0,0 +1,15 @@
|
|||
output "server_public_ipv4" {
|
||||
value = hcloud_server.server.ipv4_address
|
||||
}
|
||||
|
||||
output "server_public_ipv6" {
|
||||
value = hcloud_server.server.ipv6_address
|
||||
}
|
||||
|
||||
output "server_private_ipv4" {
|
||||
value = hcloud_server_network.server_network.ip
|
||||
}
|
||||
|
||||
output "server_name" {
|
||||
value = hcloud_server.server.name
|
||||
}
|
23
template/hetzner-infra/modules/server/primary_ip.tf
Normal file
23
template/hetzner-infra/modules/server/primary_ip.tf
Normal file
|
@ -0,0 +1,23 @@
|
|||
# resource "hcloud_primary_ip" "main_ipv4" {
|
||||
# name = "pip-${var.server_name}-ipv4"
|
||||
# type = "ipv4"
|
||||
# assignee_type = "server"
|
||||
# auto_delete = false
|
||||
# assignee_id = hcloud_server.server.id
|
||||
# labels = merge(
|
||||
# var.labels,
|
||||
# { "Resource_Type" = "Primary_IP" }
|
||||
# )
|
||||
# }
|
||||
|
||||
# resource "hcloud_primary_ip" "main_ipv6" {
|
||||
# name = "pip-${var.server_name}-ipv6"
|
||||
# type = "ipv6"
|
||||
# assignee_type = "server"
|
||||
# assignee_id = hcloud_server.server.id
|
||||
# auto_delete = false
|
||||
# labels = merge(
|
||||
# var.labels,
|
||||
# { "Resource_Type" = "Primary_IP" }
|
||||
# )
|
||||
# }
|
19
template/hetzner-infra/modules/server/server.tf
Normal file
19
template/hetzner-infra/modules/server/server.tf
Normal file
|
@ -0,0 +1,19 @@
|
|||
resource "hcloud_server" "server" {
|
||||
name = "vm-${var.server_name}"
|
||||
server_type = var.server_type
|
||||
image = var.server_image
|
||||
location = var.server_location
|
||||
backups = var.server_backups
|
||||
ssh_keys = [data.hcloud_ssh_key.ansible_provision_key.id]
|
||||
labels = merge(
|
||||
var.labels,
|
||||
{
|
||||
"Resource_Type" = "Virtual_Machine"
|
||||
"Service_Type" = var.service_type
|
||||
}
|
||||
)
|
||||
public_net {
|
||||
ipv4_enabled = true
|
||||
ipv6_enabled = true
|
||||
}
|
||||
}
|
5
template/hetzner-infra/modules/server/server_network.tf
Normal file
5
template/hetzner-infra/modules/server/server_network.tf
Normal file
|
@ -0,0 +1,5 @@
|
|||
resource "hcloud_server_network" "server_network" {
|
||||
server_id = hcloud_server.server.id
|
||||
network_id = var.server_network_id
|
||||
ip = var.server_private_ipv4
|
||||
}
|
35
template/hetzner-infra/modules/server/variables.tf
Normal file
35
template/hetzner-infra/modules/server/variables.tf
Normal file
|
@ -0,0 +1,35 @@
|
|||
variable "server_name" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "server_type" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "server_image" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "server_location" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "server_backups" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "labels" {
|
||||
type = map(string)
|
||||
}
|
||||
|
||||
variable "server_private_ipv4" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "server_network_id" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "service_type" {
|
||||
type = string
|
||||
}
|
8
template/hetzner-infra/modules/server/versions.tf
Normal file
8
template/hetzner-infra/modules/server/versions.tf
Normal file
|
@ -0,0 +1,8 @@
|
|||
terraform {
|
||||
required_providers {
|
||||
hcloud = {
|
||||
source = "hetznercloud/hcloud"
|
||||
version = "~> 1.41.0"
|
||||
}
|
||||
}
|
||||
}
|
15
template/hetzner-infra/network.tf
Normal file
15
template/hetzner-infra/network.tf
Normal file
|
@ -0,0 +1,15 @@
|
|||
resource "hcloud_network" "network" {
|
||||
name = "vnet-${var.project_name}"
|
||||
ip_range = "10.0.0.0/16"
|
||||
labels = merge(
|
||||
local.common_labels,
|
||||
{ "Resource_Type" = "Virtual_Network" }
|
||||
)
|
||||
}
|
||||
|
||||
resource "hcloud_network_subnet" "subnet" {
|
||||
network_id = hcloud_network.network.id
|
||||
type = "cloud"
|
||||
ip_range = "10.0.1.0/24"
|
||||
network_zone = "eu-central"
|
||||
}
|
7
template/hetzner-infra/outputs.tf
Normal file
7
template/hetzner-infra/outputs.tf
Normal file
|
@ -0,0 +1,7 @@
|
|||
output "public_ip" {
|
||||
value = module.server.server_public_ipv4
|
||||
}
|
||||
|
||||
output "private_ip" {
|
||||
value = module.server.server_private_ipv4
|
||||
}
|
3
template/hetzner-infra/provider.tf
Normal file
3
template/hetzner-infra/provider.tf
Normal file
|
@ -0,0 +1,3 @@
|
|||
provider "hcloud" {
|
||||
token = var.hcloud_token
|
||||
}
|
12
template/hetzner-infra/server.tf
Normal file
12
template/hetzner-infra/server.tf
Normal file
|
@ -0,0 +1,12 @@
|
|||
module "server" {
|
||||
source = "./modules/server"
|
||||
server_name = "node-001"
|
||||
server_type = "cx11"
|
||||
server_image = "debian-12"
|
||||
server_location = var.location
|
||||
server_backups = true
|
||||
server_private_ipv4 = "10.0.1.1"
|
||||
server_network_id = hcloud_network.network.id
|
||||
service_type = "Basic"
|
||||
labels = local.common_labels
|
||||
}
|
36
template/hetzner-infra/variables.tf
Normal file
36
template/hetzner-infra/variables.tf
Normal file
|
@ -0,0 +1,36 @@
|
|||
variable "hcloud_token" {
|
||||
type = string
|
||||
sensitive = true
|
||||
}
|
||||
|
||||
variable "environment" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "project_name" {
|
||||
type = string
|
||||
default = "project"
|
||||
}
|
||||
|
||||
variable "location" {
|
||||
type = string
|
||||
default = "nbg1"
|
||||
}
|
||||
|
||||
locals {
|
||||
environment_long = lookup(
|
||||
{
|
||||
dev = "Development",
|
||||
tst = "Test",
|
||||
prd = "Production"
|
||||
},
|
||||
var.environment,
|
||||
"Development"
|
||||
)
|
||||
|
||||
common_labels = {
|
||||
"Project" = var.project_name
|
||||
"Owner" = "Oscar"
|
||||
"Environment" = local.environment_long
|
||||
}
|
||||
}
|
9
template/hetzner-infra/versions.tf
Normal file
9
template/hetzner-infra/versions.tf
Normal file
|
@ -0,0 +1,9 @@
|
|||
terraform {
|
||||
required_version = ">= 1.5.2"
|
||||
required_providers {
|
||||
hcloud = {
|
||||
source = "hetznercloud/hcloud"
|
||||
version = "~> 1.41.0"
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue