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 і посилайтеся 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).

Приклад 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:
  • Зберігайте маніфести як джерело правди; 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 стане керованим, безпечним і швидким, а релізи - атомарними і оборотними.

Contact

Зв’яжіться з нами

Звертайтеся з будь-яких питань або за підтримкою.Ми завжди готові допомогти!

Telegram
@Gamble_GC
Розпочати інтеграцію

Email — обов’язковий. Telegram або WhatsApp — за бажанням.

Ваше ім’я необов’язково
Email необов’язково
Тема необов’язково
Повідомлення необов’язково
Telegram необов’язково
@
Якщо ви вкажете Telegram — ми відповімо й там, додатково до Email.
WhatsApp необов’язково
Формат: +код країни та номер (наприклад, +380XXXXXXXXX).

Натискаючи кнопку, ви погоджуєтесь на обробку даних.