Infrastructura ca cod: Terraform, Ansible
Infrastructura ca cod: Terraform, Ansible
1) De ce IaC și modul în care diferă instrumentele
Terraform - orchestrator declarativ-IaC: creează/modifică infrastructura cloud (VPC, K8s, LB, DB, IAM) prin intermediul furnizorilor. Gestionează ciclul de viață al resurselor și stochează starea.
Ansible - procedural config-IaC și managementul configurației: configurează gazde/software (pachete, fișiere, servicii), știe cum să ofere aplicații, șablon, orchestrarea pașilor. Fără un agent (SSH/WinRM), cu idempotența sarcinilor.
Combinație: Terraform - „din ce este făcută platforma”, Ansible - „cum este configurată și lansată”.
2) Structura depozitelor și straturilor
Vă recomandăm 3 straturi:1. Fundația (Zona de aterizare): rețele, IAM, KMS, jurnalele de bază/monitorizare.
2. Platforma: clustere Kubernetes, baze de date, cozi, stiva de observabilitate.
3. Volume de lucru: spații/namespace, conturi de servicii, politici, configurații.
Repo:- 'iac/terraform/' - module şi medii (' module/', 'envs/').
- „iac/ansible/” - roluri („ roluri/”), playbook-uri („playbooks/”), inventare („ invenţii/”).
- „politici/” - OPA/Conftest reguli.
- 'pipelines/' - CI/CD scripts (scame/plan/apply/test).
3) Terraform: module, stare, medii
3. 1 Module
Mici, reutilizate: "vpc'," eks', "rds'," redis "," alb "," iam-rol ".
Intrări variabile → ". tf ', ieşiri →' ieşiri. tf ', versiuni - prin registrul de module/git-tags.
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 State
Backend de la distanță (S3/GCS + DynamoDB/LockTable) + încuietori.
Separarea în funcție de mediu: "prod. TFATE ', "punerea în scenă. Tfstate '.
State-drift: „plan terraform” în CI în grafic; alertă atunci când derivă.
hcl terraform {
backend "s3" {
bucket = "iac-state"
key = "prod/network/terraform. tfstate"
region = "eu-central-1"
dynamodb_table = "iac-locks"
encrypt = true
}
}
3. 3 Spații de lucru/Envs
Opțiuni:- Directoare separate "envs/prod'," envs/stage "(vizual).
- Spații de lucru pentru variații de lumină, dar evitați amestecarea secretelor.
- Parametrii prin „tfvars':” prod. tfvars', "scenă. tfvars'.
4) Ansible: Roluri, Inventare, Idempotence
4. 1 Roluri și cărți de redare
Galaxy standard:
roles/
nginx/
tasks/main. yml templates/.j2 handlers/main. yml defaults/main. yml playbooks/
site. yml
Exemplu Playbook:
yaml
- hosts: web become: true roles:
- role: nginx vars:
nginx_listen_port: 8080
4. 2 Inventare și dinamică
'inventories/prod/hosts. yml '+ variabile' group _ vars/host _ vars'.
Inventar dinamic: 'aws _ ec2', 'gcp _ computer', 'kubernetes. core ".
4. 3 Idempotenţa
Utilizați module (nu „shell”) acolo unde este posibil.
'changed _ when '/' check _ mode' pentru alergări uscate.
Agenţii se gândesc doar la schimbări.
5) Secrete și configurații
Terraform: secreția valorilor prin „sensibil = adevărat”; secretele în sine nu sunt în stat (magazin în AWS Secrets Manager/HashiCorp Vault/KMS și se referă la sursa de date).
Ansible: Vault pentru criptare variabilă ('ansible-vault crypt'), integrare cu HashiCorp Vault/KMS.
GitOps: secrete într-o repo/stocare separată, acces prin cel mai mic privilegiu.
6) Politica ca cod
OPA/Conftest pentru planurile Terraform: interzicerea S3 publice, deschis SG, resurse fără taguri (etichete).
Terraform Cloud/Enterprise - Sentinel ca alternativă.
Ansible Lint: stil și securitate (fără „sudo: da” acolo unde nu este necesar, fără coajă brută).
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) Testarea IaC
Terraform: „tflint”, „tfsec ”/„ checkov”, Terratest (Go) pentru verificări de integrare.
Ansible: 'ansible-scame', Molecule (+ Docker/Podman/EC2) pentru a testa rolurile.
Teste de fum după aplicare: sonde HTTP, port/procese, drepturi.
8) CI/CD и GitOps
Conductă (la cererea Pull/Merge):1. Lint/Sec: tflint, tfsec/checkov, ansible-scame.
2. Plan: „plan terraform” cu publicarea artefactului (comentariu în MR).
3. Policy Gate: Conftest/Sentinel.
4. Aplicați (manual/aprobat): numai pe principal cu semnătura artefactelor.
5. Desfășurare ansible: „--check” pe scenă, apoi „--diff” în prod.
6. Post-verificări: sintetice/Probe, tabloul de bord de adnotare eliberare.
GitOps:- Păstrați manifestele ca sursă de adevăr; Argo CD/Flux pentru Kubernetes, dar clustere de bază/primitive prin Terraform.
9) Modele pentru Kubernetes, rețele, baze de date
9. 1 Kubernetes
Terraform: clustere EKS/GKE/AKS, noduri, IAM, StorageClass, LB.
Ansible: pregătirea AMI/bastion, asamblarea imaginilor/depozitelor, post-instalare (busteni/agenți/OTel).
9. 2 Rețele și perimetru
Terraform: VPC/subrețele/NAT/Transit-Gateway/WAF, rute.
Ansible: NGINX/Envoy/HAProxy config, TLS, WAF reguli de configurare.
9. 3 Baze/cache/cozi
Terraform: RDS/CloudSQL parametru grup, Redis/ElastiCache, Kafka/MSK.
Ansible: cache warm-up, locuri de muncă de migrare, configurarea de backup/agenți.
10) Exemple de configurații
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 - sursa de date a secretului
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 Rolul ansible - postgresql-client (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 cu șablon
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) Drift și managementul conformității
„Planul terraform” periodic în cheie numai pentru citire; creează un bilet atunci când există o discrepanță.
Ansible --check programat pentru roluri critice (modul de audit).
Rapoarte: politici OPA/Conftest eșuate, resurse de backup/monitorizare fără taguri.
12) Observabilitate și audit
'terraform apply' logs și artefacte plan - salvați pentru depozitarea obiectelor.
Ansible: 'callback _ plugins' (json) → jurnal central/ELK; include ID de locuri de muncă, comite SHA, trace_id.
Măsurători: timpul de execuție al planurilor/cărților de redare, frecvența modificărilor, acoperirea testelor.
13) Siguranță
Modul/semnătură de rol sau etichete fixe/hashes.
Drepturile IAM minime („planul” ≠ „se aplică”), separă rolurile CI și aplicația umană.
Criptarea de stat/busteni, registre private de module/roluri.
Politica „fără secrete în VCS”, scanere secrete (gitleaks/trufflehog).
14) Anti-modele
Un modul monstru Terraform „pentru tot”; lipsesc versiunile modulului.
Local 'terraform. Tfstate 'şi fără încuietori.
Editări manuale în nor peste IaC → derivă eternă.
Ansible 'shell '/' command' în loc de module (pauze idempotency).
Inventarul „într-un singur fișier” fără grupuri/variabile, amestecarea prod/etapă.
Secrete în vars/depozite, absența Vault/KMS.
Aplicați fără plan și fără Peer Review.
15) Lista de verificare a implementării (0-45 zile)
0-10 zile
Configurați backend/blocare la distanță, extindeți modulele Terraform.
Activați tflint/tfsec/checkov, ansible-scame; negociază etichete/etichete de resurse.
Creați roluri Ansible pentru NGINX/agenți/loggeri; organizează inventarele.
11-25 zile
Adăugați Conftest/OPA, Terratest și Molecule pentru module/roluri critice.
CI: „plan” pe MR, plan artefact, manual-se aplică cu aprobare; Ansible '--check' на scenă.
Integrați stocarea secretă (Vault/KMS/Secrets Manager).
26-45 zile
Program auto pentru detectarea derivei, rapoarte de politică.
Director de module/roluri cu versioning; "README. md' în fiecare.
GitOps: adnotări ale versiunilor, o combinație cu porți de monitorizare și alertă.
16) Valorile maturității
% din mediile cu stare la distanță și încuietori = 100%.
Ponderea modulelor/rolurilor cu teste (Terratest/Molecule) ≥ de 70%.
Timpul mediu de la MR pentru a aplica (prod) este de ore, nu zile.
Zero „derivă manuală” (toate modificările trec prin MR).
100% din resursele critice sunt acoperite de Policy as Code (tag-uri, criptare, backup).
17) Concluzie
Terraform specifică o bază de infrastructură previzibilă, repetabilă; Ansible aduce gazde și servicii în statul dorit. Adăugați politica ca cod, starea de la distanță cu locație, teste, gestionarea secretă și CI/CD cu plan→review→apply - iar bucla IaC devine gestionabilă, sigură și rapidă, iar versiunile sunt atomice și reversibile.