GH GambleHub

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.

Exemplu de apel modul:
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ă.

Exemplu backend:
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ă).

Exemplu de Conftest (rego, simplificat):
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.

Contact

Contactați-ne

Scrieți-ne pentru orice întrebare sau solicitare de suport.Suntem mereu gata să ajutăm!

Telegram
@Gamble_GC
Pornește integrarea

Email-ul este obligatoriu. Telegram sau WhatsApp sunt opționale.

Numele dumneavoastră opțional
Email opțional
Subiect opțional
Mesaj opțional
Telegram opțional
@
Dacă indicați Telegram — vă vom răspunde și acolo, pe lângă Email.
WhatsApp opțional
Format: cod de țară și număr (de exemplu, +40XXXXXXXXX).

Apăsând butonul, sunteți de acord cu prelucrarea datelor dumneavoastră.