Infrastructure as Code: Terraform, Ansible
Infrastructure as Code: Terraform, Ansible
1) Неге IaC және құралдардың айырмашылығы қандай
Terraform - декларативтік orchestrator-IaC: провайдерлер арқылы бұлттық инфрақұрылымды (VPC, K8s, LB, БД, IAM) құрады/өзгертеді. Ресурстардың өмірлік циклін басқарады және жай-күйін сақтайды.
Ansible - процедуралық config-IaC және конфигурациялық менеджмент: хосттарды/бағдарламалық жасақтамаларды (пакеттерді, файлдарды, сервистерді) теңшейді, қосымшаларды провижнингті, темплейтингті, қадамдар оркестрін біледі. Агенттерсіз (SSH/WinRM), тапсырмалардың теңсіздігімен.
Комбинация: Terraform - «платформадан жасалған», Ansible - «ол қалай конфигурацияланған және іске қосылады».
2) Репозиторийлер мен қабаттардың құрылымы
3 қабатты ұсынамыз:1. Foundation (Landing Zone): желілер, IAM, KMS, базалық журналдар/мониторинг.
2. Platform: Kubernetes кластерлері, базалар, кезектер, observability-стек.
3. Workloads: кеңістіктер/неймспейстер, сервистік аккаунттар, саясаткерлер, конфигтер.
Репо:- 'iac/terraform/' - модульдер мен қоршаулар (' modules/', 'envs/').
- 'iac/ansible/' - рөлдер (' roles/'), плейбуктар ('playbooks/'), мүкәммалдар (' inventories/').
- 'policies/' - OPA/Conftest ережелері.
- 'pipelines/' - CI/CD скрипттері (lint/plan/apply/test).
3) Terraform: модульдер, стейт, қоршау
3. 1 модульдері
Шағын, қайта пайдаланылатын: 'vpc', 'eks', 'rds', 'redis', 'alb', 'iam-role'.
→ 'variables. tf ', шығыстар →' outputs. tf ', нұсқасы -/git-тегтер тізілімі арқылы.
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 (S3/GCS + DynamoDB/LockTable) + бұғаттау.
Орталар бойынша бөлу: 'prod. tfstate`, `staging. tfstate`.
State-drift: 'terraform plan' кесте бойынша CI; дрейф кезіндегі алерт.
hcl terraform {
backend "s3" {
bucket = "iac-state"
key = "prod/network/terraform. tfstate"
region = "eu-central-1"
dynamodb_table = "iac-locks"
encrypt = true
}
}
3. 3 Workspaces / Envs
Нұсқалар:- Жеке каталогтар 'envs/prod', 'envs/stage' (көрнекі түрде).
- Workspaces жеңіл вариациялар үшін, бірақ құпияларды араластырудан аулақ болыңыз.
- 'tfvars': 'prod. tfvars`, `stage. tfvars`.
4) Ansible: рөлдер, мүкәммал, іспеттілік
4. 1 Рөлдер мен ойнатқыштар
Galaxy стандарты:
roles/
nginx/
tasks/main. yml templates/.j2 handlers/main. yml defaults/main. yml playbooks/
site. yml
Плейбук мысалы:
yaml
- hosts: web become: true roles:
- role: nginx vars:
nginx_listen_port: 8080
4. 2 Мүкәммал және динамика
`inventories/prod/hosts. yml '+ айнымалылар' group _ vars/host _ vars '.
Динамикалық мүкәммал: 'aws _ ec2', 'gcp _ compute', 'kubernetes. core`.
4. 3 Теңсіздік
Мүмкіндігінше ('shell' емес) модульдерін пайдаланыңыз.
Құрғақ аралық үшін 'changed _ when '/' check _ mode'.
Handlers өзгерістерде ғана рефлексияланады.
5) Құпиялар мен конфигалар
Terraform: 'sensitive = true' арқылы мәндердің секрециясы; құпиялардың өзі - state емес (AWS Secrets Manager/HashiCorp Vault/KMS-де сақтаңыз және деректер көзіне сілтеме жасаңыз).
Ansible: Айнымалыларды шифрлау үшін Vault ('ansible-vault encrypt'), HashiCorp Vault/KMS біріктіру.
GitOps: жеке репо/қоймадағы құпиялар, least-privilege арқылы қол жеткізу.
6) Саясат және сәйкестік (Policy as Code)
Terraform жоспарлары үшін OPA/Conftest: ашық S3, ашық SG, белгіленбеген ресурстар (tags).
Terraform Cloud/Enterprise - Sentinel балама ретінде.
Ansible Lint: стиль және қауіпсіздік ('sudo: yes' жоқ, қажет емес жерде, raw-shell жоқ).
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) IaC тестілеу
Интеграциялық тексерулер үшін Terraform: 'tflint', 'tfsec '/' checkov', Terratest (Go).
Рөлдерді тексеру үшін ansible: 'ansible-lint', Molecule (+ Docker/Podman/EC2).
Смоук-тесттер кейін apply: HTTP probes, порт/процестер, құқықтар.
8) CI/CD и GitOps
Пайплайн (Pull/Merge Request):1. Lint/Sec: tflint, tfsec/checkov, ansible-lint.
2. Plan: артефактіні жариялаумен 'terraform plan' (MR-дағы түсініктеме).
3. Policy Gate: Conftest/Sentinel.
4. Apply (manual/approved): тек артефактілерге қол қоя отырып main.
5. Ansible deploy: '--check' -stage, содан кейін '--diff' -prod.
6. Post-checks: синтетика/Probe, дашборд аннотация релизі.
GitOps:- Манифесттерді шындық көзі ретінде сақтаңыз; Kubernetes үшін Argo CD/Flux, бірақ базалық кластерлер/примитивтер - Terraform арқылы.
9) Kubernetes желілеріне арналған паттерндер, БД
9. 1 Kubernetes
Terraform: EKS/GKE/AKS кластерлері, тораптары, IAM, StorageClass, LB.
Ansible: AMI/бастиондарды дайындау, суреттерді/репозиторийлерді жинау, post-install (логгерлер/агенттер/OTel).
9. 2 Желілер және периметр
Terraform: VPC/кіші желілер/NAT/Transit-Gateway/WAF, бағыттар.
Ansible: NGINX/Envoy/HAProxy, TLS, WAF ережелерінің конфигі.
9. 3 Базалар/кэштер/кезектер
Terraform: RDS/CloudSQL параметр-топтары, Redis/ElastiCache, Kafka/MSK.
Ansible: кэшті жылыту, миграция тапсырмалары, бэкаптарды/агенттерді теңшеу.
10) Конфигурация мысалдары
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 - құпия деректер көзі
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-client рөлі (фрагмент)
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 темплейті
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) Дрейфті және сәйкестікті басқару
Кезеңдік 'terraform plan' в read-only кілті; сәйкессіздік кезінде тикет жасайды.
Критикалық рөлдерге арналған кесте бойынша Ansible --check (audit-режим).
Есептер: орындалмаған OPA/Conftest саясаты, тегсіз/backup/мониторинг ресурстары.
12) Бақылау және аудит
'terraform apply' логтары мен жоспарлар артефактілері - объектілік қоймада сақтаңыз.
Ansible: 'callback _ plugins' (json) → орталық лог/ELK; job ID, commit SHA, trace_id қосыңыз.
Метрика: жоспарларды/плейбуктерді орындау уақыты, өзгерістер жиілігі, тесттермен жабу.
13) Қауіпсіздік
Модульдердің/рөлдердің қолтаңбасы немесе бекітілген тегтер/хэштер.
Ең аз IAM құқықтары ('plan' ≠ 'apply'), CI және адам-аппруверінің рөлдерін бөлісіңіз.
Күйді/логтарды шифрлау, модульдердің/рөлдердің жеке тізілімдері.
«No plaintext secrets in VCS» саясаты, құпия-сканерлер (gitleaks/trufflehog).
14) Қарсы үлгілер
Terraform бір монстр модулі «барлығына»; модульдер нұсқаларының болмауы.
Жергілікті 'terraform. tfstate 'және бұғаттаудың болмауы.
Бұлттағы қолмен түзетулер IaC → мәңгілік дрейф.
Модульдердің орнына Ansible 'shell '/' command' (теңсіздікті бұзады).
Топтары/айнымалылары жоқ «бір файлдағы» мүкәммал, prod/stage араластыру.
vars/репозиторийдегі құпиялар, Vault/KMS болмауы.
Apply Жоспарсыз және Peer Review-сіз.
15) Енгізу чек-парағы (0-45 күн)
0-10 күн
Қашықтағы backend/lock бағдарламасын баптау, Terraform модульдерін тарату.
tflint/tfsec/checkov, ansible-lint; ресурстардың тегтері/лейблдері туралы келісу.
NGINX/агенттер/логерлер үшін Ansible рөлдерін бастау; мүкәммалды ұйымдастыру.
11-25 күн
Сыни модульдер/рөлдер үшін Conftest/OPA, Terratest және Molecule қосыңыз.
CI: MR-ға 'plan', жоспар артефактісі, appruvпен manual-apply; Ansible `--check` на stage.
Құпия сақтау орнын біріктіру (Vault/KMS/Secrets Manager).
26-45 күн
drift-детектор үшін кесте бойынша авто-жоспар, саясаткерлер бойынша есептер.
Нұсқасы бар модульдер/рөлдер каталогы; README құжаттамасы. md 'әр қайсысында.
GitOps: релиздер аңдатпалары, мониторинг және алерт-гейт байланысы.
16) Жетілу метрикасы
Қашықтағы state және локі бар ортаның% = 100%.
Тесті бар модульдердің/рөлдердің үлесі (Terratest/Molecule) 70% ≥.
MR-дан apply (prod) -ке дейінгі орташа уақыт - сағат, күн емес.
Нөлдік «қол дрейфі» (барлық өзгерістер MR арқылы өтеді).
Сыни ресурстардың 100% -ы Policy as Code (тегтер, шифрлау, backup).
17) Қорытынды
Terraform болжамды, қайталанатын инфрақұрылым базасын орнатады; Ansible хосттар мен серверлерді қажетті күйге жеткізеді. Policy as Code бағдарламасын қосыңыз, қашықтағы орналасуы, тесттер, құпия менеджмент және CI/CD жоспарымен → review → apply - және сіздің IaC контурыңыз басқарылатын, қауіпсіз және жылдам болады, ал релиздер - атомарлық және қайтарымды болады.