GH GambleHub

Infrastructure as Code: Terraform, Ansible

Infrastructure as Code: Terraform, Ansible

1) რატომ არის IaC და რით განსხვავდება ინსტრუმენტები?

Terraform არის დეკლარაციული orchestrator-IaC: ქმნის/ცვლის ღრუბლოვან ინფრასტრუქტურას (VPC, K8s, LB, BD, IAM) პროვაიდერების საშუალებით. აკონტროლებს რესურსების სასიცოცხლო ციკლს და ინახავს მდგომარეობას.
Ansible - პროცედურული config-IaC და კონფიგურაციის მენეჯმენტი: კონფიგურაცია მასპინძლები/პროგრამული უზრუნველყოფა (პაკეტები, ფაილები, სერვისები), იცის როგორ უნდა გააკეთოს აპლიკაციების რევიზია, ტემპლეიტინგი, ნაბიჯების ორკესტრი. აგენტის გარეშე (SSH/WinRM), დავალებების იდემპოტენტურობით.

კომბინაცია: Terraform - „საიდანაც გაკეთდა პლატფორმა“, Ansible - „როგორ არის მორგებული და ამოქმედებულია“.

2) საცავებისა და ფენების სტრუქტურა

გირჩევთ 3 ფენას:

1. ფონდი (Landing Zone): ქსელები, IAM, KMS, ძირითადი ჟურნალები/მონიტორინგი.

2. პლატფორმა: Kubernetes მტევანი, ბაზები, რიგები, observability დასტის.

3. Workloads: სივრცეები/ნეიმსპეები, მომსახურების ანგარიშები, პოლიტიკოსები, კონფისკაცია.

რეპო:
  • 'iac/terraform/' - მოდულები და გარემო (' მოდულები/', 'envs/').
  • 'iac/ansible/' - როლები (' roles/'), playbooks ('playbooks/'), ინვენტარი (' ინვესტიციები/').
  • 'policies/' - OPA/Conftest წესები.
  • 'pipelines/' - CI/CD სკრიპტები (lint/plan/apply/test).

3) Terraform: მოდულები, სტატი, გარემო

3. 1 მოდული

მცირე, გამოყენებული: 'vpc', 'eks', 'rdis', 'redis', 'alb', 'iam-role'.
შესასვლელი 'variables. tf ', გამოშვებები. 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 სახელმწიფო (სახელმწიფო)

დისტანციური ჩამკეტი (S3/GCS + DynamoDB/LockTable) + დაბლოკვა.
დაყოფა გარემოში: 'moden. tfstate`, `staging. tfstate`.
სახელმწიფო დრიფტი: '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/stage', 'envs/stage' (ვიზუალურად).
  • Workspaces მსუბუქი ცვალებადობისთვის, მაგრამ თავიდან აიცილეთ საიდუმლოებების შერევა.
  • პარამეტრები 'tfvars' - ის საშუალებით: 'წამყვანები. 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'; თავად საიდუმლოებები არ არის სახელმწიფო (შეინახეთ AWS საიდუმლო მენეჯერი/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' - ს გარეშე, სადაც არ არის საჭირო, raw-shell- ის გარეშე).

Conftest- ის მაგალითი (რეგო, გამარტივებული):
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) როლების შესამოწმებლად.
სმოკის ტესტები appy შემდეგ: HTTP probes, პორტი/პროცესები, უფლებები.

8) CI/CD и GitOps

Pipline (Pull/Merge Request- ზე):

1. Lint/Sec: tflint, tfsec/checkov, ansible-lint.

2. პლანი: 'terraform plan' არტეფაქტის გამოქვეყნებით (კომენტარი MR- ში).

3. Policy Gate: Conftest/Sentinel.

4. Apply (approved): მხოლოდ მაღაროში, არტეფაქტების ხელმოწერით.

5. Ansible deploy: '-check' სცენაზე, შემდეგ '-diff' -ში.

6. Post-checks: სინთეზური/Probe, გამოშვების პრეზენტაციის დაშლა.

GitOps:
  • შეინახეთ მანიფესტები, როგორც სიმართლის წყარო; Argo CD/Flux for Kubernetes, მაგრამ ძირითადი მტევანი/პრიმიტივები - Terraform- ის საშუალებით.

9) ნიმუშები კუბერნეტებისთვის, ქსელები, BD

9. 1 Kubernetes

Terraform: EKS/GKE/AKS მტევანი, კვანძები, IAM, StorageClass, LB.
Ansible: AMI/სარდაფების მომზადება, სურათების/საცავის შეკრება, პოსტის ინსტალაცია (ლოგერები/აგენტები/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 Template

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 გრაფიკის კრიტიკული როლებისთვის (აუდიტის რეჟიმი).
მოხსენებები: შეუსრულებელი პოლიტიკოსები OPA/Conftest, რესურსები ჭდეების/backup/მონიტორინგის გარეშე.

12) დაკვირვება და აუდიტი

logs 'terraform apply' და გეგმების ნიმუშები - შეინახეთ ობიექტის საცავში.
Ansible: 'callback _ plugins' (json) - ცენტრალური ჟურნალი/ELK; ჩართეთ job ID, commit SHA, trace _ id.
მეტრიკა: გეგმების/პლეიბუკების შესრულების დრო, ცვლილებების სიხშირე, ტესტების დაფარვა.

13) უსაფრთხოება

მოდულის/როლების ხელმოწერა ან ფიქსირებული ჭდეები/ჰეში.
მინიმალური IAM უფლებები ('plan' apply '), გაიზიარეთ CI და approver- ის როლები.
სახელმწიფო/ლოგოების დაშიფვრა, მოდულის/როლების პირადი რეესტრები.
პოლიტიკა „no plaintext საიდუმლოებები VCS- ში“, საიდუმლო სკანერები (gitleaks/trufflehog).

14) ანტი შაბლონები

ერთი მონსტრი მოდული Terraform „ყველაფრისთვის“; მოდულის ვერსიების არარსებობა.
ადგილობრივი 'terraform. tfstate 'და საკეტების ნაკლებობა.
IaC- ის თავზე ღრუბელში ხელით გამოსწორება მარადიული დრიფტია.
მოდულის ნაცვლად Ansible 'shell '/' command' (არღვევს idempotence).
ინვენტარი „ერთ ფაილში“ ჯგუფების/ცვლადის გარეშე, შერევა/ეტაპი.
საიდუმლოებები vars/საცავებში, Vault/KMS- ის არარსებობა.
Apply გარეშე Plan და Peer Review.

15) განხორციელების სიის სია (0-45 დღე)

0-10 დღე

დისტანციური პაკეტის/ლოკის კონფიგურაცია, Terraform მოდულების დაშლა.
ჩართეთ tflint/tfsec/checkov, ansible-lint; შეთანხმდნენ რესურსების ტეგებზე/ეტიკეტებზე.
შეასრულეთ Ansible როლი NGINX/აგენტებისთვის/ლოგერებისთვის; ინვენტარის ორგანიზება.

11-25 დღე

დაამატეთ Conftest/OPA, Terratest და Molecule კრიტიკული მოდულები/როლებისთვის.
CI: 'plan' on MR, გეგმის არტეფაქტი, მანუალური-აპლუსი აპლოვით; Ansible `--check` на stage.
საიდუმლო საცავის ინტეგრაცია (Vault/KMS/Secrets მენეჯერი).

26-45 დღე

საგზაო გეგმა დრიფტის დეტალებისთვის, მოხსენებები პოლიტიკოსების შესახებ.
ვერსიით მოდულის/როლების კატალოგი; დოკუმენტაცია 'README. თითოეულში md '.
GitOps: გამოშვების ვიდეოები, მონიტორინგი და ალერტის კარიბჭეები.

16) სიმწიფის მეტრიკა

დისტანციური სახელმწიფო და ხალიჩების მქონე გარემოს% = 100%.
ტესტებით მოდულის/როლების წილი (Terratest/Molecule) 70% -ს შეადგენს.
საშუალო დრო MR- დან appy- მდე (mosh) არის საათი, არა დღეები.
ნულოვანი „სახელმძღვანელო დრიფტი“ (ყველა ცვლილება გადის MR).
კრიტიკული რესურსების 100% დაფარულია Policy as Code- ით (ჭდეები, დაშიფვრა, ქილა).

17) დასკვნა

Terraform ადგენს პროგნოზირებადი, განმეორებით ინფრასტრუქტურის ბაზას; Ansible მასპინძლებს და მომსახურებებს მიაქვს საჭირო მდგომარეობაში. დაამატეთ Policy as Code, წაშლილი სახელმწიფო, ტესტები, საიდუმლო მენეჯმენტი და CI/CD პლანის მიმოხილვით - და თქვენი IaC წრე გახდება კონტროლირებადი, უსაფრთხო და სწრაფი, ხოლო გამოშვებები იქნება ატომური და შექცევადი.

Contact

დაგვიკავშირდით

დაგვიკავშირდით ნებისმიერი კითხვის ან მხარდაჭერისთვის.ჩვენ ყოველთვის მზად ვართ დაგეხმაროთ!

Telegram
@Gamble_GC
ინტეგრაციის დაწყება

Email — სავალდებულოა. Telegram ან WhatsApp — სურვილისამებრ.

თქვენი სახელი არასავალდებულო
Email არასავალდებულო
თემა არასავალდებულო
შეტყობინება არასავალდებულო
Telegram არასავალდებულო
@
თუ მიუთითებთ Telegram-ს — ვუპასუხებთ იქაც, დამატებით Email-ზე.
WhatsApp არასავალდებულო
ფორმატი: ქვეყნის კოდი და ნომერი (მაგალითად, +995XXXXXXXXX).

ღილაკზე დაჭერით თქვენ ეთანხმებით თქვენი მონაცემების დამუშავებას.