initial terraform code
This commit is contained in:
37
.gitignore
vendored
Normal file
37
.gitignore
vendored
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# ---> Terraform
|
||||||
|
# Local .terraform directories
|
||||||
|
**/.terraform/*
|
||||||
|
|
||||||
|
# .tfstate files
|
||||||
|
*.tfstate
|
||||||
|
*.tfstate.*
|
||||||
|
|
||||||
|
# Crash log files
|
||||||
|
crash.log
|
||||||
|
|
||||||
|
# Exclude all .tfvars files, which are likely to contain sentitive data, such as
|
||||||
|
# password, private keys, and other secrets. These should not be part of version
|
||||||
|
# control as they are data points which are potentially sensitive and subject
|
||||||
|
# to change depending on the environment.
|
||||||
|
#
|
||||||
|
*secret*.tfvars
|
||||||
|
|
||||||
|
# Ignore override files as they are usually used to override resources locally and so
|
||||||
|
# are not checked in
|
||||||
|
override.tf
|
||||||
|
override.tf.json
|
||||||
|
*_override.tf
|
||||||
|
*_override.tf.json
|
||||||
|
|
||||||
|
# Include override files you do wish to add to version control using negated pattern
|
||||||
|
#
|
||||||
|
# !example_override.tf
|
||||||
|
|
||||||
|
# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
|
||||||
|
*tfplan*
|
||||||
|
|
||||||
|
# Ignore CLI configuration files
|
||||||
|
.terraformrc
|
||||||
|
terraform.rc
|
||||||
|
|
||||||
|
tfplan_dl
|
||||||
46
.terraform.lock.hcl
generated
Normal file
46
.terraform.lock.hcl
generated
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
# This file is maintained automatically by "terraform init".
|
||||||
|
# Manual edits may be lost in future updates.
|
||||||
|
|
||||||
|
provider "registry.terraform.io/hetznercloud/hcloud" {
|
||||||
|
version = "1.35.2"
|
||||||
|
constraints = "1.35.2"
|
||||||
|
hashes = [
|
||||||
|
"h1:a/DH+2jHvgikSDajup5feRZRUwNw8OT9NBPKezjgM5g=",
|
||||||
|
"zh:1a7cb8f9cbd51b62bdbb4f36cdb070dd99059d86115c4777193e0f8536798d4d",
|
||||||
|
"zh:29c104aae7f7a4e1a4aea32febc9caa2d7d86589cd9d01d5b93dbe2cb0a73220",
|
||||||
|
"zh:29f082195d8f4e4cfb4050fae2ed62ed5616659c6dfaa7b5f1eb42d94d130864",
|
||||||
|
"zh:3cfe3876763659e27696adcb945e6da2dc2ec014ff8a2e8f0f3e610e3bfd9b73",
|
||||||
|
"zh:3d967f4b1aef78ffce389dd32cdea4b558ef826cec96ceb4bdafde4bb4a9b655",
|
||||||
|
"zh:3e160f581f7912c2053f86d6d8a3e3470fcf1fe8228b59ac216a7e40a1dd444c",
|
||||||
|
"zh:5138022c8b4c8a572e8097749241d929a96d3522e67ce25f86bb9fd51c4b343c",
|
||||||
|
"zh:5783febc4d8ac4b7fdb49607cab92ad13509d87ad4ca1999067ac3d20e815d12",
|
||||||
|
"zh:7f8ce9268d48beb5fa0103a8510d4fe644aaac6cd328fc4441dd37e8bdbfadab",
|
||||||
|
"zh:8ab6aea82657fd6f97d79b41e6cd129a33a47ce727a7d0b52205590fa3785ce1",
|
||||||
|
"zh:9e4bebe3bbee7875dc2e3ceca3cf0fec3254a8b481c7b96ba9a5d65647ea9092",
|
||||||
|
"zh:af2a912db9a6fce844ac8c0e695a5d92a5625f2df126129940051a6b1021443d",
|
||||||
|
"zh:bfe86d80e55f44a99dbbdca9d1caf0c837fe21d91e78674ee36263b7de71fd38",
|
||||||
|
"zh:d9538a361bd8979c4a87273a82fc5dec7110f3aa7ec69fffb8c70fe8937bc1f4",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "registry.terraform.io/ionos-developer/ionosdeveloper" {
|
||||||
|
version = "0.0.1"
|
||||||
|
constraints = ">= 0.0.1"
|
||||||
|
hashes = [
|
||||||
|
"h1:EsbYrlAajO0JuWTtDmY5srsWm8TWOEtM+VfliBgSmag=",
|
||||||
|
"zh:04dc3d964dac33d1ff16e5893517c8b724cc0726bb93cb7bcd95eca25bb028fa",
|
||||||
|
"zh:090e552495d6766b26380a49c2bea4fdd898f0de641792b646bfc9e844ae5ab7",
|
||||||
|
"zh:0fe5eb23d65c42792d51ea55dce1f00ef1dd0ecba710827efd9218369dba6463",
|
||||||
|
"zh:1f71e1db13d3d6dfc09d6e95f8232ce23c78c72d126db23499f22c529496a744",
|
||||||
|
"zh:557325b7766cbc4ccbc0fee36469ecc0c96fb3bc7cf75036289161444906cb63",
|
||||||
|
"zh:7cbb553d04fa5cb53fd13e3684709712fde9ef5be0dca8e2eca8d27c8cda6bb1",
|
||||||
|
"zh:9fed4131682204eb4e1a4d05000192a904d3645305c52d05d8fac5e3f264a1f6",
|
||||||
|
"zh:b1cfb981617a3b276fbd95d60831e6f8a3207e806acb0dfa48f3d880694ecfe7",
|
||||||
|
"zh:b32a84063690cf3cf7c72b63051dc51d3da9697d355f100bb51ef4c766e14b04",
|
||||||
|
"zh:b3eea4f8cbd8a452f0688f0839009387ade879be768ea378dfc61937657cea00",
|
||||||
|
"zh:b865969d0ad218f96716c96128545afe11974717ec48a8dfb4b22f21c439c25e",
|
||||||
|
"zh:d1c06c76da4ad5f3589b0361fcb8cf563d651fe6e7261828d2d8e36a9b1bc727",
|
||||||
|
"zh:e60a2ad003970d038ac9bae82a7983315e186e22d51b78c52301a4fa7ccd3655",
|
||||||
|
"zh:f0544e6b18b2af7b0d2a567d33f304df9a9961a94f2692c7af91aef4f2b785df",
|
||||||
|
]
|
||||||
|
}
|
||||||
19
cloud.userdata
Normal file
19
cloud.userdata
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#cloud-config
|
||||||
|
users:
|
||||||
|
- name: oli
|
||||||
|
primary_group: oli
|
||||||
|
groups: sudo
|
||||||
|
shell: /bin/bash
|
||||||
|
sudo: ALL=(ALL) NOPASSWD:ALL
|
||||||
|
ssh_authorized_keys:
|
||||||
|
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFpczZfQ5MrfjSYz8MnDHG4sM2cQ8cIsj3ALDGtmW3zu
|
||||||
|
|
||||||
|
package_update: true
|
||||||
|
package_upgrade: true
|
||||||
|
|
||||||
|
runcmd:
|
||||||
|
- sed -i -e '/^PermitRootLogin/s/^.*$/PermitRootLogin no/' /etc/ssh/sshd_config
|
||||||
|
- sed -i -e '/^PasswordAuthentication/s/^.*$/PasswordAuthentication no/' /etc/ssh/sshd_config
|
||||||
|
- sed -i -e '/^X11Forwarding/s/^.*$/X11Forwarding no/' /etc/ssh/sshd_config
|
||||||
|
- sed -i -e '/^#MaxAuthTries/s/^.*$/MaxAuthTries 3/' /etc/ssh/sshd_config
|
||||||
|
- systemctl restart sshd.service
|
||||||
21
dns.tf
Normal file
21
dns.tf
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# IONOS DNS
|
||||||
|
|
||||||
|
data "ionosdeveloper_dns_zone" "selected" {
|
||||||
|
name = "twirling.de"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "ionosdeveloper_dns_record" "main_ipv4" {
|
||||||
|
zone_id = data.ionosdeveloper_dns_zone.selected.id
|
||||||
|
name = "cloud.${data.ionosdeveloper_dns_zone.selected.name}"
|
||||||
|
type = "A"
|
||||||
|
content = hcloud_primary_ip.main_ipv4.ip_address
|
||||||
|
ttl = 3600
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "ionosdeveloper_dns_record" "main_ipv6" {
|
||||||
|
zone_id = data.ionosdeveloper_dns_zone.selected.id
|
||||||
|
name = "cloud.${data.ionosdeveloper_dns_zone.selected.name}"
|
||||||
|
type = "AAAA"
|
||||||
|
content = hcloud_primary_ip.main_ipv6.ip_address
|
||||||
|
ttl = 3600
|
||||||
|
}
|
||||||
32
firewall.tf
Normal file
32
firewall.tf
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Hetzner Cloud Firewall
|
||||||
|
|
||||||
|
resource "hcloud_firewall" "icmp" {
|
||||||
|
name = "ICMP"
|
||||||
|
rule {
|
||||||
|
direction = "in"
|
||||||
|
protocol = "icmp"
|
||||||
|
source_ips = [
|
||||||
|
"0.0.0.0/0",
|
||||||
|
"::/0"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
apply_to {
|
||||||
|
label_selector = "env=prod"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "hcloud_firewall" "ssh" {
|
||||||
|
name = "SSH"
|
||||||
|
rule {
|
||||||
|
direction = "in"
|
||||||
|
protocol = "tcp"
|
||||||
|
port = "22"
|
||||||
|
source_ips = [
|
||||||
|
var.ows_gateway.ipv4,
|
||||||
|
var.ows_gateway.ipv6
|
||||||
|
]
|
||||||
|
}
|
||||||
|
apply_to {
|
||||||
|
label_selector = "env=prod"
|
||||||
|
}
|
||||||
|
}
|
||||||
93
instances.tf
Normal file
93
instances.tf
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
# Create a new SSH key in cloud console
|
||||||
|
resource "hcloud_ssh_key" "default" {
|
||||||
|
name = "terraform-ansible"
|
||||||
|
public_key = var.dtsv_hcloud_ssh_key
|
||||||
|
}
|
||||||
|
|
||||||
|
# Hetzner Primary IP
|
||||||
|
|
||||||
|
resource "hcloud_primary_ip" "main_ipv4" {
|
||||||
|
name = "primary_ipv4_web"
|
||||||
|
datacenter = "fsn1-dc14"
|
||||||
|
type = "ipv4"
|
||||||
|
assignee_type = "server"
|
||||||
|
auto_delete = false
|
||||||
|
labels = {
|
||||||
|
"mapping" : "WEB"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "hcloud_primary_ip" "main_ipv6" {
|
||||||
|
name = "primary_ipv6_web"
|
||||||
|
datacenter = "fsn1-dc14"
|
||||||
|
type = "ipv6"
|
||||||
|
assignee_type = "server"
|
||||||
|
auto_delete = false
|
||||||
|
labels = {
|
||||||
|
"mapping" : "WEB"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Hetzner Cloud Servers
|
||||||
|
|
||||||
|
resource "hcloud_server" "web" {
|
||||||
|
name = "WEB"
|
||||||
|
server_type = "cpx21"
|
||||||
|
image = "ubuntu-22.04"
|
||||||
|
datacenter = "fsn1-dc14"
|
||||||
|
ssh_keys = [hcloud_ssh_key.default.id]
|
||||||
|
user_data = file("cloud.userdata")
|
||||||
|
labels = {
|
||||||
|
"env" : "prod"
|
||||||
|
}
|
||||||
|
|
||||||
|
network {
|
||||||
|
network_id = hcloud_network.vpc.id
|
||||||
|
ip = "10.0.0.2"
|
||||||
|
}
|
||||||
|
|
||||||
|
public_net {
|
||||||
|
ipv4_enabled = true
|
||||||
|
ipv4 = hcloud_primary_ip.main_ipv4.id
|
||||||
|
ipv6_enabled = true
|
||||||
|
ipv6 = hcloud_primary_ip.main_ipv6.id
|
||||||
|
}
|
||||||
|
|
||||||
|
# **Note**: the depends_on is important when directly attaching the
|
||||||
|
# server to a network. Otherwise Terraform will attempt to create
|
||||||
|
# server and sub-network in parallel. This may result in the server
|
||||||
|
# creation failing randomly.
|
||||||
|
depends_on = [
|
||||||
|
hcloud_network_subnet.subnet
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "hcloud_server" "db" {
|
||||||
|
name = "DB"
|
||||||
|
server_type = "cpx11"
|
||||||
|
image = "ubuntu-22.04"
|
||||||
|
datacenter = "fsn1-dc14"
|
||||||
|
ssh_keys = [hcloud_ssh_key.default.id]
|
||||||
|
user_data = file("cloud.userdata")
|
||||||
|
labels = {
|
||||||
|
"env" : "prod"
|
||||||
|
}
|
||||||
|
|
||||||
|
network {
|
||||||
|
network_id = hcloud_network.vpc.id
|
||||||
|
ip = "10.0.0.3"
|
||||||
|
}
|
||||||
|
|
||||||
|
public_net {
|
||||||
|
ipv4_enabled = true
|
||||||
|
ipv6_enabled = true
|
||||||
|
}
|
||||||
|
|
||||||
|
# **Note**: the depends_on is important when directly attaching the
|
||||||
|
# server to a network. Otherwise Terraform will attempt to create
|
||||||
|
# server and sub-network in parallel. This may result in the server
|
||||||
|
# creation failing randomly.
|
||||||
|
depends_on = [
|
||||||
|
hcloud_network_subnet.subnet
|
||||||
|
]
|
||||||
|
}
|
||||||
34
main.tf
Normal file
34
main.tf
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# Providers
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
hcloud = {
|
||||||
|
source = "hetznercloud/hcloud"
|
||||||
|
version = "1.35.2"
|
||||||
|
}
|
||||||
|
ionosdeveloper = {
|
||||||
|
source = "ionos-developer/ionosdeveloper"
|
||||||
|
version = ">= 0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Set the variable value in *.tfvars file
|
||||||
|
# or using the -var="hcloud_token=..." CLI option
|
||||||
|
# or get from env variable (export = abc132)
|
||||||
|
|
||||||
|
# Hetzner Cloud
|
||||||
|
variable "dtsv_hcloud_token" {}
|
||||||
|
# Configure the Hetzner Cloud Provider
|
||||||
|
provider "hcloud" {
|
||||||
|
token = var.dtsv_hcloud_token
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ionos Cloud
|
||||||
|
variable "dtsv_ionos_token" {}
|
||||||
|
# Configure the Ionos Developer Provider
|
||||||
|
provider "ionosdeveloper" {
|
||||||
|
api_key = var.dtsv_ionos_token
|
||||||
|
}
|
||||||
|
|
||||||
|
# Public SSH Key
|
||||||
|
variable "dtsv_hcloud_ssh_key" {}
|
||||||
13
network.tf
Normal file
13
network.tf
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Hetzner Cloud Networks
|
||||||
|
|
||||||
|
resource "hcloud_network" "vpc" {
|
||||||
|
name = "VPC"
|
||||||
|
ip_range = "10.0.0.0/24"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "hcloud_network_subnet" "subnet" {
|
||||||
|
type = "cloud"
|
||||||
|
network_id = hcloud_network.vpc.id
|
||||||
|
network_zone = "eu-central"
|
||||||
|
ip_range = "10.0.0.0/24"
|
||||||
|
}
|
||||||
19
volume.tf
Normal file
19
volume.tf
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Hetzner Cloud Volume
|
||||||
|
|
||||||
|
resource "hcloud_volume" "web" {
|
||||||
|
name = "WEB"
|
||||||
|
location = "fsn1"
|
||||||
|
size = 10
|
||||||
|
format = "ext4"
|
||||||
|
delete_protection = true
|
||||||
|
labels = {
|
||||||
|
"env" : "prod"
|
||||||
|
"attachment" : "WEB"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "hcloud_volume_attachment" "volume_attachment_web" {
|
||||||
|
volume_id = hcloud_volume.web.id
|
||||||
|
server_id = hcloud_server.web.id
|
||||||
|
automount = false
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user