GH GambleHub

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; дрейф кезіндегі алерт.

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 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 жоқ).

Conftest мысалы (rego, оңайлатылған):
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 контурыңыз басқарылатын, қауіпсіз және жылдам болады, ал релиздер - атомарлық және қайтарымды болады.

Contact

Бізбен байланысыңыз

Кез келген сұрақ немесе қолдау қажет болса, бізге жазыңыз.Біз әрдайым көмектесуге дайынбыз!

Telegram
@Gamble_GC
Интеграцияны бастау

Email — міндетті. Telegram немесе WhatsApp — қосымша.

Сіздің атыңыз міндетті емес
Email міндетті емес
Тақырып міндетті емес
Хабарлама міндетті емес
Telegram міндетті емес
@
Егер Telegram-ды көрсетсеңіз — Email-ге қоса, сол жерге де жауап береміз.
WhatsApp міндетті емес
Пішім: +ел коды және номер (мысалы, +7XXXXXXXXXX).

Батырманы басу арқылы деректерді өңдеуге келісім бересіз.