Infrastructure as Code: Terraform, Ansible
Infrastructure as Code: Terraform, Ansible
1) Эмне үчүн IaC жана кандай аспаптар менен айырмаланат
Terraform - декларативдик orchestrator-IaC: булут инфраструктурасын (VPC, K8s, LB, DD, IAM) провайдерлер аркылуу түзөт/өзгөртөт. Ресурстардын жашоо циклин башкарат жана байлыгын сактайт.
Ansible - процедуралык config-IaC жана конфигурациялык башкаруу: хосттарды/программаларды (пакеттерди, файлдарды, кызматтарды) конфигурациялайт, колдонмолорду, темплейтингди, кадамдарды топтоону билет. Агент жок (SSH/WinRM), милдеттердин демпотенттиги менен.
Айкалышы: Terraform - "платформа жасалган", Ansible - "ал орнотулган жана ишке".
2) Репозиторийлердин жана катмарлардын түзүлүшү
3 катмар сунуш:1. Foundation (Landing Zone): тармактар, IAM, KMS, негизги журналдар/мониторинг.
2. Платформа: Kubernetes кластерлери, базалар, кезектер, observability-стек.
3. Workloads: мейкиндик/неймспейстер, тейлөө эсептери, саясатчылар, конфиги.
Репо:- 'iac/terraform/' - модулдар жана чөйрөлөр (' modules/', 'envs/').
- 'iac/ansible/' - ролдор (' roles/'), плейбуктар ('playbooks/'), инвентарлар (' inventories/').
- 'policies/' - OPA/Conftest эрежелери.
- 'pipelines/' - CI/CD скрипттери (lint/plan/apply/test).
3) Терраформ: модулдары, мамлекеттик, айлана-чөйрө
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 Ролдор жана Playbook
Galaxy стандарты:
roles/
nginx/
tasks/main. yml templates/.j2 handlers/main. yml defaults/main. yml playbooks/
site. yml
Playbook мисал:
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' аркылуу маанилердин секрециясы; өздөрү сырлар - мамлекеттик эмес (AWS Secrets Manager/HashiCorp Vault/KMS сактоо жана маалымат булактарына шилтеме).
Ansible: өзгөрмөлүү коддоо үчүн Vault ('ansible-vault encrypt'), HashiCorp Vault/KMS менен бириктирүү.
GitOps: өзүнчө репо/сактоо сырлары, least-privilege аркылуу кирүү.
6) Саясат жана шайкештик (Саясат кодекс)
OPA/Conftest үчүн Terraform пландары: коомдук S3 тыюу, ачык SG, белгиленбеген ресурстар (tags).
Terraform Cloud/Enterprise - альтернатива катары Sentinel.
Ansible Lint: стили жана коопсуздук (жок 'sudo: yes' зарыл эмес жерде, чийки-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 сыноо
Терраформ: 'tflint', 'tfsec '/' checkov', Терратест (Go) интеграциялык текшерүүлөр үчүн.
Ansible: 'ansible-lint', Molecule (+ Docker/Podman/EC2) ролдорду текшерүү үчүн.
Smouk тесттер кийин apply: HTTP probes, порт/процесстер, укуктар.
8) CI/CD и GitOps
Pipeline (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): экспонаттардын кол тамгасы менен гана негизги.
5. Ansible deploy: '--check' on stage, андан кийин '--diff' in prod.
6. Post-текшерүү: синтетика/Probe, dashboard жарыялоо аннотация.
GitOps:- Манифесттерди чындыктын булагы катары сактаңыз; Kubernetes үчүн Argo CD/Flux, бирок негизги кластерлер/примитивдер - Terraform аркылуу.
9) Kubernetes үчүн үлгүлөр, тармактар, DD
9. 1 Kubernetes
Terraform: EKS/GKE/AKS кластерлер, түйүндөр, IAM, StorageClass, LB.
Ansible: AMI/бастиондорду даярдоо, сүрөттөрдү/репозиторийлерди чогултуу, пост-орнотуу (логгерлер/агенттер/OTel).
9. 2 Тармактар жана периметри
Терраформ: VPC/көмөкчордондор/NAT/Transit-Gateway/WAF, каттамдар.
Ansible: NGINX/Envoy/HAProxy, TLS, WAF эрежелери.
9. 3 Базалар/кэш/кезек
Terraform: RDS/CloudSQL параметр тобу, Redis/ElastiCache, Kafka/MSK.
Ansible: кэш жылытуу, миграциялык тапшырмалар, backaps/агенттерди орнотуу.
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) Drift башкаруу жана шайкештик
Мезгил-мезгили менен 'terraform plan' жылы read-only ачкыч; айырмачылыктар болгондо билетти түзөт.
Ansible --check критикалык ролдору үчүн график боюнча (аудит режими).
Отчеттор: аткарылбаган OPA/Conftest саясаты, тегсиз ресурстар/backup/мониторинг.
12) Байкоо жана аудит
Logi '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) Анти-үлгүлөрү
Бир Monster Module Terraform "бардык"; модулдардын версияларынын жоктугу.
Жергиликтүү 'terraform. tfstate 'жана блоктордун жоктугу.
IaC үстүнөн булуттагы кол түзөтүүлөр → түбөлүк дрейф.
Ansible 'shell '/' command' модулдарынын ордуна (демпотенттикти бузат).
Инвентаризация "бир файл" жок топтор/өзгөрмөлүү, аралаштыруу prod/этап.
vars/репозиторийдеги сырлар, Vault/KMS жоктугу.
Apply No Plan жана 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 боюнча "план", план артефакты, appruve менен manual-apply; Ansible `--check` на stage.
Жашыруун сактоо (Vault/KMS/Secrets Manager).
26-45 күн
drift detector үчүн Auto-план, саясат отчеттор.
Модулдарды/ролдорду версиялоо каталогу; документация 'README. ар бир md '.
GitOps: релиздердин аннотациялары, мониторинг жана алерт-гейт менен байланыш.
16) Жетилүү метрикасы
алыскы мамлекеттик жана блоктор менен чөйрөлөрдүн% = 100%.
тесттер менен модулдарды/ролдорду үлүшү (Terratest/Molecule) ≥ 70%.
MR apply (prod) чейин орточо убакыт - күн эмес, саат.
Нөлдүк "кол дрейф" (бардык өзгөртүүлөр MR аркылуу өтөт).
100% критикалык ресурстар Policy as Code (тегдер, шифрлөө, backup) менен капталган.
17) Корутунду
Терраформ болжолдонгон, кайталануучу инфраструктура базасын белгилейт; Ansible хостинг жана кызматтарды талап кылынган абалга алып келет. Policy as Code кошуу, жайгашкан менен алыскы мамлекет, тесттер, жашыруун башкаруу жана план менен CI/CD → review → apply - жана сиздин IaC контур башкарылуучу, коопсуз жана тез болот, жана релиздер - атомдук жана кайтарылуучу.