Infrastruktura jako kod: Terraform, Anialny
Infrastruktura jako kod: Terraform, Anialny
1) Dlaczego IaC i jak różnią się narzędzia
Terraform - deklaracyjny orkiestrator-IaC: tworzy/modyfikuje infrastrukturę chmury (VPC, K8s, LB, DB, IAM) za pośrednictwem dostawców. Zarządza cyklem życia zasobów i przechowuje stan.
Ansible - procesowe zarządzanie konfiguracją i konfiguracją: konfiguruje hosty/oprogramowanie (pakiety, pliki, usługi), wie, jak dostarczać aplikacje, szablonowanie, orkiestrowanie kroków. Bez agenta (SSH/WinRM), z idempotencją zadań.
Kombinacja: Terraform - „z czego platforma jest wykonana”, Ansible - „jak jest skonfigurowana i uruchomiona”.
2) Struktura repozytoriów i warstw
Polecamy 3 warstwy:1. Fundacja (strefa lądowania): sieci, IAM, KMS, logi bazowe/monitoring.
2. Platforma: Kubernetes klastry, bazy danych, kolejki, stos obserwacji.
3. Obciążenia robocze: spacje/obszary nazw, konta usług, zasady, konfiguracje.
Repo:- „iac/terraform/” - moduły i środowiska („ moduły/”, „envs/”).
- „iac/ansible/” - role („ role/”), playbooks („playbooks/”), zapasy („ inventories/”).
- „policies/” - OPA/Conftest rules.
- „pipelines/” - skrypty CI/CD (lint/plan/apply/test).
3) Terraform: moduły, stan, środowiska
3. 1 Moduły
Mały, ponownie używany: 'vpc',' eks', 'rds', 'redis', 'alb', 'iam-role'.
Wejścia → 'zmienne. tf ', wyjścia →' wyjścia. tf ', wersje - poprzez rejestr modułów/git-tagów.
hcl module "vpc" {
source = "git::ssh://git@repo/iac. git//modules/vpc? ref=v1. 6. 0"
name = "prod-core"
cidr = "10. 0. 0. 0/16"
azs = ["eu-central-1a","eu-central-1b"]
}
3. 2 Państwo
Remote backend (S3/GCS + DynamoDB/LockTable) + blokady.
Oddzielenie od środowiska: "prod. tfstate ',' inscenizacja. tfstate '.
Dryf państwowy: „plan terraform” w CI zgodnie z harmonogramem; Uwaga podczas dryfowania.
hcl terraform {
backend "s3" {
bucket = "iac-state"
key = "prod/network/terraform. tfstate"
region = "eu-central-1"
dynamodb_table = "iac-locks"
encrypt = true
}
}
3. 3 Miejsca pracy/zawiści
Opcje:- Oddzielne katalogi "envs/prod'," envs/stage "(visual).
- Miejsca pracy dla różnic światła, ale unikać mieszania tajemnic.
- Parametry za pomocą 'tfvars': 'prod. tfvars ',' etap. tfvars ".
4) Niedostępne: Role, inwentaryzacje, Idempotencja
4. 1 Role i playbooks
Standard galaktyki:
roles/
nginx/
tasks/main. yml templates/.j2 handlers/main. yml defaults/main. yml playbooks/
site. yml
Przykład Playbook:
yaml
- hosts: web become: true roles:
- role: nginx vars:
nginx_listen_port: 8080
4. 2 Inwentaryzacje i dynamika
"inventories/prod/hosts. yml '+ variables' group _ vars/host _ vars'.
Inwentaryzacja dynamiczna: 'aws _ ec2', 'gcp _ compute', 'kubernetes'. rdzeń ".
4. 3 Idempotencja
W miarę możliwości należy używać modułów (nie „powłoki”).
'changed _ when '/' check _ mode' dla suchych biegów.
Opiekunowie zastanawiają się tylko nad zmianami.
5) Tajemnice i konfiguracje
Terraform: wydzielanie wartości przez „wrażliwe = prawdziwe”; same sekrety nie są w stanie (przechowywać w AWS Secrets Manager/HashiCorp Vault/KMS i odnosić się do źródła danych).
Ansible: Skarbiec do szyfrowania zmiennego („szyfrowanie skarbca”), integracja z HashiCorp Vault/KMS.
GitOps: sekrety w osobnym repo/magazynie, dostęp przez najmniejszy przywilej.
6) Polityka jako kodeks
OPA/Conftest dla planów Terraform: zakaz publicznego S3, otwarta SG, niewykorzystane zasoby (tagi).
Terraform Cloud/Enterprise - Sentinel jako alternatywa.
Lint: styl i bezpieczeństwo (bez „sudo: tak”, gdzie nie jest to potrzebne, bez surowej powłoki).
rego package terraform. security
deny[msg] {
input. resource_type == "aws_security_group_rule"
input. values. cidr_blocks[_] == "0. 0. 0. 0/0"
input. values. from_port == 22 msg:= "SSH from 0. 0. 0. 0/0 is forbidden"
}
7) Badanie IaC
Terraform: „tflint”, „tfsec ”/„ checkov”, Terratest (Go) do kontroli integracji.
Dowolny: „mrówka”, cząsteczka (+ Docker/Podman/EC2) do badań ról.
Badania dymu po zastosowaniu: sondy HTTP, port/procesy, prawa.
8) CI/CD - GitOps
Rurociąg (na żądanie ciągnięcia/połączenia):1. Lint/Sec: tflint, tfsec/checkov, edible-lint.
2. Plan: „plan terraform” wraz z publikacją artefaktu (komentarz w MR).
3. Brama polityczna: Conftest/Sentinel.
4. Zastosowanie (ręczne/zatwierdzone): tylko na głównej stronie z podpisem artefaktów.
5. Rozmieścić: '--check' na scenie, a następnie '--diff' w prod.
6. Po sprawdzeniu: syntetyka/sonda, deska rozdzielcza adnotacji.
Gitopy:- Zachowaj manifesty jako źródło prawdy; Argo CD/Flux dla Kubernetes, ale podstawowe klastry/prymitywy przez Terraform.
9) Wzory dla kubernetów, sieci, baz danych
9. 1 Kubernety
Terraform: zgrupowania EKS/GKE/AKS, węzły, IAM, LB.
Dostępny: przygotowanie AMI/bastionu, montaż obrazu/repozytoria, po instalacji (rejestratory/agenci/OTel).
9. 2 Sieci i obwód
Terraform: VPC/podsieci/NAT/Transit-Gateway/WAF, trasy.
Dostępny: NGINX/Envoy/HAProxy config, TLS, konfiguracja zasad WAF.
9. 3 Podstawy/bufory/kolejki
Terraform: parametr grupy RDS/CloudSQL, Redis/ElastiCache, Kafka/MSK.
Możliwe: nagrzewanie pamięci podręcznej, migracja, tworzenie kopii zapasowych/agentów.
10) Przykłady konfiguracji
10. 1 Terraform - RDS PostgreSQL + SG
hcl module "db" {
source = "terraform-aws-modules/rds/aws"
engine = "postgres"
engine_version = "15. 4"
instance_class = "db. m6g. large"
allocated_storage = 100 name = "core"
username = var. db_user password = var. db_password # см. secret data source vpc_security_group_ids = [module. db_sg. security_group_id]
multi_az = true backup_retention = 7
}
module "db_sg" {
source = "terraform-aws-modules/security-group/aws"
name = "db-core"
vpc_id = module. vpc. vpc_id ingress_cidr_blocks = ["10. 0. 0. 0/8"]
ingress_rules = ["postgresql-tcp"]
}
10. 2 Terraform - źródło danych tajemnicy
hcl data "aws_secretsmanager_secret_version" "db" {
secret_id = "prod/db/core"
}
variable "db_password" {
type = string sensitive = true default = jsondecode(data. aws_secretsmanager_secret_version. db. secret_string). password
}
10. 3 Ansible - postgresql-rola klienta (fragment)
yaml
- name: Install packages apt:
name: [ "postgresql-client-15" ]
state: present update_cache: yes
- name: Create. pgpass copy:
dest: /home/deploy/.pgpass mode: '0600'
content: "{{ db_host }}:5432:core:{{ db_user }}:{{ db_password }}"
no_log: true
- name: Smoke query shell: psql -h {{ db_host }} -U {{ db_user }} -d core -c "select 1"
register: psql_out changed_when: false
10. 4 Ansible - NGINX z szablonem
yaml
- name: Deploy nginx. conf template:
src: templates/nginx. conf. j2 dest: /etc/nginx/nginx. conf notify: Restart nginx
- name: Ensure nginx running service:
name: nginx state: started enabled: true
handlers:
- name: Restart nginx service: { name: nginx, state: restarted }
11) Zarządzanie dryfem i zgodności
okresowy „plan terraform” w kluczu wyłącznie do odczytu; tworzy bilet, gdy istnieje rozbieżność.
Dowolny --check zaplanowany dla ról krytycznych (tryb audytu).
Raporty: nieudane zasady OPA/Conftest, niewykorzystane/kopie zapasowe/zasoby monitorujące.
12) Obserwowalność i audyt
„terraform apply” logi i artefakty planowania - zapisać do obiektu przechowywania.
Dostępny: 'callback _ plugins' (json) → central log/ELK; zawierać ID zadania, commit SHA, trace_id.
Metryka: czas realizacji planów/odtwarzaczy, częstotliwość zmian, pokrycie testów.
13) Bezpieczeństwo
Podpis modułu/roli lub stałe znaczniki/hashes.
Minimalne prawa IAM ("mają zastosowanie w planie" i "), oddzielają role aplikacji CI i human.
Szyfrowanie stanu/dzienników, prywatnych rejestrów modułów/ról.
Polityka „no plaintext secrets in VCS”, tajne skanery (gitleaks/trufflehog).
14) Anty-wzory
Jeden moduł potwora Terraform „za wszystko”; brakujące wersje modułu.
Local 'terraform. tfstate'i żadnych zamków.
Ręczne edycje w chmurze nad IaC → wieczny dryf.
Dowolne 'shell '/' command' zamiast modułów (łamie iempotencję).
Inwentaryzacja „w jednym pliku” bez grup/zmiennych, mieszanie prod/stage.
Sekrety w wars/repozytoriach, brak skarbca/KMS.
Zastosuj bez planu i bez Peer Review.
15) Lista kontrolna realizacji (0-45 dni)
0-10 dni
Konfigurowanie zdalnego backendu/blokady, rozszerzenie modułów Terraform.
Włącz tflint/tfsec/checkov, angielski; negocjować znaczniki/etykiety zasobów.
Tworzenie ról namacalnych dla NGINX/agentów/rejestratorów; organizować zapasy.
11-25 dni
Dodaj Konftest/OPA, Terratest i Molekuła dla modułów/ról krytycznych.
CI: „plan” w sprawie MR, artefakt w planie, ręczne stosowanie z approw; Etap „--check” bezwzględny.
Integrate Secret Storage (Vault/KMS/Secrets Manager).
26-45 dni
Auto harmonogram wykrywania dryfów, raporty zasad.
Katalog modułów/ról z wersją; "README. md 'w każdym.
GitOps: adnotacje wydań, połączenie z monitorowaniem i bramkami alarmowymi.
16) Wskaźniki zapadalności
% środowisk ze stanem zdalnym i blokadami = 100%.
Udział modułów/ról w badaniach (Terratest/Molecule) ≥ 70%.
Średni czas od MR do zastosowania (prod) to godziny, a nie dni.
Zero „ręczny dryf” (wszystkie zmiany przechodzą przez MR).
100% zasobów krytycznych jest objętych kodem polityki (tagi, szyfrowanie, kopia zapasowa).
17) Wniosek
Terraform określa przewidywalną, powtarzalną bazę infrastruktury; Ansible przynosi hostów i usług do pożądanego stanu. Dodaj zasady jako kod, zdalny stan z lokalizacją, testy, tajne zarządzanie i CI/CD z planem → przegląd → zastosuj - a Twoja pętla IaC staje się zarządzalna, bezpieczna i szybka, a wydania są atomowe i odwracalne.