Infrastructure as Code: Terraform, Ansible
Infrastructure as Code: Terraform, Ansible
1) Ինչու՞ IaC-ն և ինչ գործիքներ են տարբերվում։
Terraform-ը դեկորատիվ orchestram-IaC-ն է 'ստեղծում/փոխում է ամպային ենթակառուցվածքը (SDC, K8s, LB, BD, IAM) պրովայդերների միջոցով։ Կառավարում է ռեսուրսների կյանքի ցիկլը և պահպանում վիճակը։
Ansible-ը ֆեդեգրաֆիայի-IaC-ի և միգրացիոն ղեկավարությունն է 'տեղադրում է հոստներ/ծրագրակազմեր (փաթեթներ, ֆայլեր, ծառայություններ), գիտի, թե ինչպես է դիմումները, տեմպլեյթինգը, քայլերի նվագարկումը։ Առանց գործակալի (SSH/WinRM), խնդիրների դիմադրության հետ։
Համադրություն ՝ Terraform-ը «որից պատրաստված է պլատֆորմը», Ansible-ը '«ինչպես է այն տրամադրվում և սկսվում»։
2) Ռեպոզորիայի և շերտերի կառուցվածքը
3 շերտի տրամագիծը
1. Foundation (Landing Zone) 'ցանցեր, IAM, KMS, հիմնական ամսագրեր/2019։
2. Platform: Kubernetes կլաստերներ, հիմքեր, հերթեր, observability-ek։
3. Workloads: Տարածքներ/նեյրոսպեյսներ, ծառայողական հաշիվներ, քաղաքականություններ, դելեգներ։
Ռեպո
«iac/terraform/» - մոդուլներ և միջավայրեր (« modules/», «envs/»)։
«iac/ansible/» - դերեր (« roles/»), պլեյբուսներ («playbooks/»), բուլիարի (« entories/»)։
«policies/» - OPA/Wintest կանոնները։
«pipelines/» - CI/CD ջութակներ (lint/plan/apply/test)։
3) Terraform: մոդուլներ, սթեյթ, շրջապատեր,
3. 1 Մոդուլներ
Փոքր, փոխպատվաստված ՝ «www.c», «eks», «rds», «redis», «alb», «iam-role»։
Մուտքերը 'variables։ tf ', TED-ը։ tf ', տարբերակները' մոդուլների/git-tegi-ի միջոցով։
Զանգահարելու օրինակը բացատրվում է
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 + DeloDB/DiskTable) + արգելափակումը։
Բաժանումը շրջապատով '<108։ 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/no», «envs/stage» (տեսողական)։
Workspaces-ը թեթև տարբերությունների համար, բայց խուսափեք գաղտնիքները խառնելուց։
Պարամետրերը 'tfvars ':' 108։ tfvars`, `stage. tfvars`.
4) Ansible 'դերեր, Dimari, idempotention
4. 1 Դերեր և պլեյբուսներ
Black 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 '+ ww.gg _ vars/host _ vars "։
Դինամիկ կիսագնդի '"aws _ ec2", "gcp _ comport", "kubernetes։ core`.
4. 3 Idempotenty
Օգտագործեք մոդուլները (ոչ «shell») այնտեղ, որտեղ հնարավոր է։
«changed _ when »/« www.k _ mode» չոր անցքերի համար։
Handlers-ը ռեֆլեկտիվացնում է միայն փոփոխությունների ժամանակ։
5) Գաղտնիքներն ու եզրերը
Terraform: արժեքների սեկրեցիա '«sportitive = www.ru»; գաղտնիքները state չեն (պահեք AWS Secrets System/HashiProp Vox/KFC-ում և հղում կատարեք աղբյուրին)։
Ansible: Vox-ը փոփոխականների համար («ansible-vensencrypt»), ինտեգրումը HashiProp Vance/KSA-ի հետ։
GitOps: գաղտնիքները առանձին ռեպո/պահեստում, հասանելիությունը ձախ-privilege։
6) Քաղաքականությունը և համապատասխանությունը (Policy as Code)
OPA/Wintest-ը Terraform պլանների համար 'հանրային S3 արգելք, բաց SG, անհնազանդ ռեսուրսներ (tags)։
Terraform Cloud/Enterprise - Sentinel որպես այլընտրանք։
Ansible Lint: ոճը և անվտանգությունը (առանց 'sudo: yes' որտեղ կարիք չկա, առանց rance-shell)։
Distest (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 »/« www.kov», Terratest (Go) ինտեգրացիոն ստուգումների համար։
Ansible: «ansible-lint», Molecule (+ Docker/Podman/EC2) դերերը ստուգելու համար։
Smok-թեստերը 'HTTP probes, նավահանգիստ/գործընթացներ, իրավունքներ։
8) CI/CD и GitOps
Propline (Pox/Merge Request)
1. Lint/Sec: tflint, tfsec/checkov, ansible-lint.
2. Plan: «terraform plan» -ը արտեֆակտի հրապարակմամբ (մեկնաբանություն MR)։
3. Policy Gate: Conftest/Sentinel.
4. Appy (manault/approved) 'միայն main-ի վրա արտեֆակտների ստորագրությամբ։
5. Ansible deploy: "--check" -ը stage-ում, ապա '----diff "-ում։
6. Post-interks: սինթեզիկա/Probe, dashbord Records։
GitOps:- Պահեք մանիֆեստները որպես ճշմարտության աղբյուր։ Argo CD/Flux-ի համար, բայց հիմնական կլաստերները/պրիմիտիվները Terraform-ի միջոցով։
9) Kubernetes, ցանցեր, BD
9. 1 Kubernetes
Terraform: EKS/GKE/AKS կլաստերներ, AM, Storts Class, LB։
Ansible: AMI/bastions պատրաստումը, պատկերների/ռեպոզորիայի հավաքումը, post-install (loggers/07/OTel)։
9. 2 Ցանցեր և պարիմետրեր
Terraform: MSC/ենթաօրենսդրություն/NAT/Transit-Gateway/WAF, երթուղիներ։
Ansible: NGINX/Envoy/HAProxy, TSA, 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/Wintest քաղաքականությունները, ռեսուրսները առանց թեգերի/backup/մոնիտորինգի։
12) Դիտողությունն ու աուդիտը
Լոգները 'terraform apply "և պլանների արտեֆակտները, պահպանեք օբյեկտի պահեստում։
Ansible: «callback _ plugins» (json) - կենտրոնական լոգ/ELK; միացրեք jB ID, commit SHA, trace _ id.
Պիտակները 'պլանների/պլեյբուսների կատարման ժամանակը, փոփոխության հաճախությունը, թեստերի ծածկումը։
13) Անվտանգություն
Մոդուլների/դերերի ստորագրումը կամ ֆիքսված թեգերը/հեշերը։
Նվազագույն IAM իրավունքները («plan 'port 'apply»), կիսեք CI և Appruver դերերը։
Պետության/լոգարանների կոդավորումը, մոդուլների/դերերի մասնավոր օրինակները։
Քաղաքականությունը «plaintext secrets in VCS», գաղտնիքը սկաներներ (gitleaks/trufflehog)։
14) Anti-patterna
Մեկ հրեշային մոդուլ Terraform «ամեն ինչի վրա»; մոդուլների տարբերակների բացակայությունը։
Տեղական 'terraform։ tfstate 'և արգելափակումների բացակայությունը։
IaC-ի վերևում գտնվող ամպի ձեռքով ձեռքերը հավիտենական դրեյֆ են։
Ansible 'shell '/« command »-ը մոդուլների փոխարեն (կոտրում է idempotention)։
Ֆեդարը «մեկ ֆայլում» առանց խմբերի/փոփոխականների, խառնուրդի/stage։
Գաղտնիքները vars/rezosory, Vox/KFC բացակայությունը։
Appy առանց Plan-ի և առանց Peer Review-ի։
15) Ներդրման թուղթ (0-45 օր)
0-10 օր
Տեղադրել հեռավոր backend/www.k, տեղադրել Terraform մոդուլները։
Ներառել tflint/tfsec/www.kov, ansible-lint; պայմանավորվել փորձարկումների/ռեսուրսների պիտակների մասին։
Ansible-ի դերը NGINX/գործակալների/լոգերների համար։ կազմակերպենք դելարի։
11-25 օր
Ավելացնել Deltest/OPA, Terratest և Molecule-ը կրիտիկական մոդուլների/դերերի համար։
CI: «plan» -ը MR-ում, պլանի արտեֆակտը, manox-apply-ը 'appruve-ով; Ansible `--check` на stage.
Ինտեգրել գաղտնի պահեստը (Vox/KMS/Secrets System)։
26-45 օր
Avto պլանը drift-ի համար, քաղաքական հաշվետվությունները։
Մոդուլների/դերերի կատալոգը տարբերակով; 07 'READA։ md 'յուրաքանչյուրում։
GitOps: Առյուծների ծանոթությունները, մոնիտորինգի և ալերտ խաղացողների հետ։
16) Հասունության մետրերը
հեռավոր state և lock շրջակա միջավայրի% -ը = 100%։
Մոդուլների/դերերի մասնաբաժինը թեստերի հետ (Terratest/Molecule) կազմում է 70 տոկոսը։
Միջին ժամանակը MR-ից մինչև apply (2019) - ժամացույց, ոչ օրեր։
Զրոյական «ձեռքով» (բոլոր փոփոխությունները կատարվում են MR-ի միջոցով)։
Կրիտիկական ռեսուրսների 100 տոկոսը ծածկված է Policy as Code (թեգեր, կոդավորում, backup)։
17) Եզրակացություն
Terraform-ը տալիս է կանխատեսելի, կրկնվող ենթակառուցվածքի հիմքը։ Ansible-ը բերում է հանրակացարաններ և ծառայություններ մինչև ֆինանսական վիճակը։ Ավելացրեք Policy as Code-ը, հեռացված state-ը, փորձարկումները, գաղտնի կառավարումը և CI/CD-ը plan plan prodaply-ով, և ձեր IaC-ն կդառնա կառավարվող, անվտանգ և արագ, իսկ թողարկումները ՝ ատոմային և շրջադարձային։