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 і посилайтеся data-джерелом).
Ansible: Vault для шифрування змінних ('ansible-vault encrypt'), інтеграція з HashiCorp Vault/KMS.
GitOps: секрети в окремому репо/сховищі, доступ за least-privilege.
6) Політики та відповідність (Policy as Code)
OPA/Conftest для Terraform планів: заборона публічних 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:- Зберігайте маніфести як джерело правди; Argo CD/Flux для Kubernetes, але базові кластери/примітиви - через 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 - data-джерело секрету
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 без Plan і без Peer Review.
15) Чек-лист впровадження (0-45 днів)
0-10 днів
Налаштувати віддалений backend/lock, розкласти модулі Terraform.
Увімкнути tflint/tfsec/checkov, ansible-lint; домовитися про теги/лейблах ресурсів.
Завести Ansible ролі для NGINX/агентів/логерів; організувати інвентарі.
11-25 днів
Додати Conftest/OPA, Terratest і Molecule для критичних модулів/ролей.
CI: 'plan'на MR, артефакт плану, 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, віддалений state з локацією, тести, секрет-менеджмент і CI/CD з plan→review→apply - і ваш контур IaC стане керованим, безпечним і швидким, а релізи - атомарними і оборотними.