Terraform: инфраструктура как код
Terraform (HashiCorp) позволяет описывать серверную инфраструктуру в виде конфигурационных файлов .tf и управлять ею через CLI. Вместо ручного создания серверов через веб-консоль — весь стек в репозитории Git.
Установка Terraform
wget https://releases.hashicorp.com/terraform/1.7.0/terraform_1.7.0_linux_amd64.zip
unzip terraform_1.7.0_linux_amd64.zip
mv terraform /usr/local/bin/
terraform --versionПример: Hetzner Cloud
# main.tf
terraform {
required_providers {
hcloud = {
source = "hetznercloud/hcloud"
version = "~> 1.44"
}
}
}
provider "hcloud" {
token = var.hcloud_token
}
# SSH ключ
resource "hcloud_ssh_key" "default" {
name = "my-key"
public_key = file("~/.ssh/id_rsa.pub")
}
# Сервер
resource "hcloud_server" "web" {
name = "web-01"
image = "ubuntu-24.04"
server_type = "cx22"
location = "nbg1"
ssh_keys = [hcloud_ssh_key.default.id]
user_data = <<-EOF
#!/bin/bash
apt update && apt install -y nginx
systemctl enable nginx
EOF
}
# Firewall
resource "hcloud_firewall" "web_fw" {
name = "web-firewall"
rule {
direction = "in"
protocol = "tcp"
port = "80"
source_ips = ["0.0.0.0/0", "::/0"]
}
rule {
direction = "in"
protocol = "tcp"
port = "443"
source_ips = ["0.0.0.0/0", "::/0"]
}
}
resource "hcloud_firewall_attachment" "web" {
firewall_id = hcloud_firewall.web_fw.id
server_ids = [hcloud_server.web.id]
}
output "server_ip" {
value = hcloud_server.web.ipv4_address
}# variables.tf
variable "hcloud_token" {
sensitive = true
}# terraform.tfvars (в .gitignore!)
hcloud_token = "your-hetzner-api-token"Основные команды
# Инициализация (скачать провайдеры)
terraform init
# Просмотр плана изменений
terraform plan
# Применить изменения
terraform apply
# Посмотреть состояние
terraform show
terraform state list
# Уничтожить инфраструктуру
terraform destroyНесколько серверов с count
resource "hcloud_server" "app" {
count = 3
name = "app-${count.index + 1}"
image = "ubuntu-24.04"
server_type = "cx22"
location = "nbg1"
ssh_keys = [hcloud_ssh_key.default.id]
}
output "app_ips" {
value = hcloud_server.app[*].ipv4_address
}Безопасность: Никогда не коммитьте
terraform.tfvars и *.tfstate в репозиторий — они содержат токены и секреты. Добавьте в .gitignore.Remote State: Для командной работы храните
terraform.tfstate в Terraform Cloud, S3 или Hetzner Object Storage — это позволяет нескольким людям управлять одной инфраструктурой.