120 lines
3.4 KiB
Markdown
120 lines
3.4 KiB
Markdown
# 01 - Test Terraform IaC
|
|
|
|
Bu asamanin amaci test Hetzner Cloud Project icinde minimum IaaS kaynaklarini Terraform ile olusturmaktir. Bu dokuman tek basina uygulanabilir olacak sekilde yazilmistir.
|
|
|
|
## Kapsam
|
|
|
|
Terraform test ortaminda sunlari olusturur:
|
|
|
|
- Private network: `iklim-test-net`
|
|
- Subnetler:
|
|
- App/Swarm subnet: `10.10.10.0/24`
|
|
- DB subnet: `10.10.20.0/24`
|
|
- Firewall:
|
|
- Public ingress: sadece `22/tcp`, `80/tcp`, `443/tcp`
|
|
- Private ingress: `07-private-network-port-matrisi.md` dosyasindaki test kurallari
|
|
- SSH key
|
|
- Placement group: `test-spread`
|
|
- Server:
|
|
- `test-swarm-01`
|
|
- `test-db-01`
|
|
- Ansible inventory output
|
|
|
|
Terraform DB yazilimini kurmaz. DB node sadece makine, network ve firewall seviyesinde hazirlanir.
|
|
|
|
## Onerilen Dosya Yapisi
|
|
|
|
```text
|
|
terraform/
|
|
hetzner/
|
|
test/
|
|
versions.tf
|
|
providers.tf
|
|
variables.tf
|
|
locals.tf
|
|
network.tf
|
|
firewall.tf
|
|
placement.tf
|
|
servers.tf
|
|
outputs.tf
|
|
terraform.tfvars.example
|
|
```
|
|
|
|
`terraform.tfvars` commit edilmeyecek. `.gitignore` icinde ignore edilmelidir.
|
|
|
|
## Degiskenler
|
|
|
|
Minimum degiskenler:
|
|
|
|
```hcl
|
|
hcloud_token = "secret"
|
|
environment = "test"
|
|
location = "fsn1"
|
|
image = "ubuntu-24.04"
|
|
server_type_swarm = "cx32"
|
|
server_type_db = "cx42"
|
|
admin_ssh_public_key_path = "~/.ssh/id_ed25519.pub"
|
|
admin_allowed_cidrs = ["X.X.X.X/32"]
|
|
```
|
|
|
|
`location` icin tek lokasyonla baslanir. Farkli region/lokasyon felaket kurtarma bu asamada konu disidir; ileride dokumana eklenmelidir.
|
|
|
|
## Server Rolleri
|
|
|
|
| Server | Private IP | Rol |
|
|
| --- | --- | --- |
|
|
| `test-swarm-01` | `10.10.10.11` | Swarm manager + app worker + Gitea runner |
|
|
| `test-db-01` | `10.10.20.11` | Manuel DB kurulumu icin hazir DB node |
|
|
|
|
Private IP'ler Terraform icinde sabit tanimlanmalidir. Ansible inventory ve firewall kurallari deterministik kalir.
|
|
|
|
## Firewall Kurallari
|
|
|
|
Public ingress:
|
|
|
|
| Port | Kaynak | Hedef |
|
|
| --- | --- | --- |
|
|
| `22/tcp` | `admin_allowed_cidrs` | Tum test node'lari |
|
|
| `80/tcp` | `0.0.0.0/0`, `::/0` | `test-swarm-01` |
|
|
| `443/tcp` | `0.0.0.0/0`, `::/0` | `test-swarm-01` |
|
|
|
|
Public ingress icin `8200/tcp`, `5432/tcp`, `27017/tcp`, `5672/tcp`, `15672/tcp`, `6379/tcp`, `2379/tcp`, `9180/tcp`, `9090/tcp`, `3000/tcp` acilmayacak.
|
|
|
|
Private ingress icin `07-private-network-port-matrisi.md` kaynak alinacak.
|
|
|
|
## Placement Group
|
|
|
|
`test-spread` placement group `type = "spread"` olacak. Testte iki server oldugu icin bu grup `test-swarm-01` ve `test-db-01` makinelerinin farkli fiziksel host'lara dagitilmasini hedefler.
|
|
|
|
Not: Spread placement group farkli kabinet veya lokasyon garantisi degildir; tek fiziksel host arizasinin etkisini azaltir.
|
|
|
|
## Terraform Cikti Beklentisi
|
|
|
|
`outputs.tf` minimum su bilgileri uretmelidir:
|
|
|
|
```hcl
|
|
output "ansible_inventory_yaml" {
|
|
sensitive = false
|
|
}
|
|
|
|
output "test_private_ips" {
|
|
sensitive = false
|
|
}
|
|
|
|
output "test_public_ips" {
|
|
sensitive = false
|
|
}
|
|
```
|
|
|
|
Inventory output'u daha sonra `ansible/inventory/generated/test.yml` dosyasina yazilabilir. Inventory dosyasinda secret bulunmayacaksa commit edilebilir; secret veya token icerirse commit edilmeyecek.
|
|
|
|
## Kabul Kriterleri
|
|
|
|
- `terraform plan` sadece test Hetzner Project token'i ile calisir.
|
|
- `terraform apply` sonrasinda 2 server olusur.
|
|
- Iki server private network uzerinden birbirine erisebilir.
|
|
- Public internetten sadece `22`, `80`, `443` firewall seviyesinde aciktir.
|
|
- Vault `8200` public'ten kapali kalir.
|
|
- Terraform state repo'ya commit edilmez.
|
|
|