Υποδομή ως κωδικός: Terraform, Ansible
Υποδομή ως κωδικός: Terraform, Ansible
1) Γιατί διαφέρουν η IaC και τα εργαλεία
Terraform - δηλωτικός ενορχηστρωτής-IaC: δημιουργεί/τροποποιεί την υποδομή νέφους (VPC, K8s, LB, DB, IAM) μέσω παρόχων. Διαχειρίζεται τον κύκλο ζωής των πόρων και αποθηκεύει κατάσταση.
Anable - διαδικαστική ρύθμιση-IaC και διαχείριση ρυθμίσεων: ρυθμίσεις φιλοξενίας/λογισμικού (πακέτα, αρχεία, υπηρεσίες), ξέρει πώς να παρέχει εφαρμογές, templating, ενορχήστρωση βημάτων. Χωρίς πράκτορα (SSH/WinRM), με ιδιαιτερότητα των καθηκόντων.
Συνδυασμός: Terraform - «από τι είναι φτιαγμένη η πλατφόρμα», Anable - «πώς διαμορφώνεται και εκτοξεύεται».
2) Δομή αποθετηρίων και επιπέδων
Συνιστούμε 3 επίπεδα:1. Ίδρυμα (Ζώνη προσγείωσης): δίκτυα, IAM, KMS, βασικά αρχεία καταγραφής/παρακολούθηση.
2. Πλατφόρμα: Συστάδες Kubernetes, βάσεις δεδομένων, ουρές αναμονής, στοίβα παρατήρησης.
3. Φόρτος εργασίας: χώροι/χώροι ονομάτων, λογαριασμοί υπηρεσιών, πολιτικές, ρυθμίσεις.
Συμφωνία επαναγοράς:- 'iac/terraform/' - ενότητες και περιβάλλοντα (' modules/', 'fens/').
- 'iac/anable/' - ρόλοι (' ρόλοι/'), βιβλία αναπαραγωγής ('playbooks/'), απογραφές (' εφευρέσεις/').
- «policies/» - OPA/Conftest κανόνες.
- «pipelines/» - CI/CD scripts (lint/plan/application/test).
3) Terraform: ενότητες, κατάσταση, περιβάλλοντα
3. 1 Ενότητες
Μικρό, επαναχρησιμοποιούμενο: «vpc», «ek ,» rd , «redis», «alb», «iam-role».
Εισάγει τις μεταβλητές των →. 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 Κράτος
Απομακρυσμένο backend (S3/GCS + DynamoDB/LockTable) + κλειδαριές.
Διαχωρισμός ανά περιβάλλον: 'prod. tfstate ',' stage. 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 Χώροι εργασίας/Περιβάλλοντα
Επιλογές:- Ξεχωριστοί κατάλογοι 'fels/prod', 'fens/stage' (οπτική).
- Χώροι εργασίας για παραλλαγές φωτός, αλλά αποφυγή ανάμειξης μυστικών.
- Παράμετροι μέσω 'tfvars': 'prod. tfvar , 'stage. tfvars '.
4) Anable: Ρόλοι, Απογραφές, Idempotence
4. 1 Ρόλοι και βιβλία παιχνιδιών
Πρότυπο γαλαξία:
roles/
nginx/
tasks/main. yml templates/.j2 handlers/main. yml defaults/main. yml playbooks/
site. yml
Παράδειγμα Playbook:
yaml
- hosts: web become: true roles:
- role: nginx vars:
nginx_listen_port: 8080
4. 2 Απογραφές και δυναμική
"inventories/prod/hosts. yml '+ μεταβλητές' ομάδα _ vars/host _ var .
Δυναμική απογραφή: 'aws _ ec2', 'gcp _ compute', 'kubernetes. πυρήνας '.
4. 3 Ιδιαιτερότητα
Χρήση δομοστοιχείων (όχι κελύφους) όπου είναι δυνατόν.
'changed _ when '/' check _ mode' for druns.
Οι φορείς εκμετάλλευσης εξετάζουν μόνο τις αλλαγές.
5) Μυστικά και ρυθμίσεις
Terraform: έκκριση τιμών μέσω 'ευαίσθητου = αληθούς', τα ίδια τα μυστικά δεν βρίσκονται στην κατάσταση (αποθηκεύονται σε AWS Secrets Manager/HashiCorp Vault/KMS και αναφέρονται στην πηγή δεδομένων).
Επιλέξιμο: Το θησαυροφυλάκιο για τη μεταβλητή κρυπτογράφηση ('κρυπτογράφηση'), ενσωμάτωση με το HashiCorp Vault/KMS.
GitOps: μυστικά σε ξεχωριστή συμφωνία επαναγοράς/αποθήκευσης, πρόσβαση με ελάχιστο προνόμιο.
6) Πολιτική ως κώδικας
OPA/Confest for Terraform plans: απαγόρευση του δημόσιου S3, του ανοικτού SG, των πόρων χωρίς ετικέτα (ετικέτες).
Terraform Cloud/Enterprise - Sentinel ως εναλλακτική λύση.
Anable Lint: στυλ και ασφάλεια (χωρίς 'sudo: ναι' όπου δεν χρειάζεται, χωρίς ακατέργαστο κέλυφος).
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: 'tflin ,' tfsec '/' checkov ', Terratest (Go) για ελέγχους ενσωμάτωσης.
Anable: 'anable-lint', Molecule (+ Docker/Podman/EC2) για τη δοκιμή ρόλων.
Δοκιμές καπνού μετά την εφαρμογή: ανιχνευτές HTTP, θύρα/διεργασίες, δικαιώματα.
8) CI/CD и GitOps
Αγωγός (κατόπιν αιτήματος έλξης/συγχώνευσης):1. Lint/Sec: tflint, tfsec/checkov, anable-lint.
2. Σχέδιο: «σχέδιο terraform» με δημοσίευση τεχνουργήματος (σχόλιο στο MR).
3. Πύλη πολιτικής: Conftest/Sentinel.
4. Εφαρμόζεται (εγχειρίδιο/εγκεκριμένο): μόνο επί της ουσίας με την υπογραφή τεχνουργημάτων.
5. Γωνιακή ανάπτυξη: '--check' στη σκηνή, στη συνέχεια '--diff' σε prod.
6. Μετά τους ελέγχους: συνθετικά/Probe, αφαίρεση σημειώσεων ταμπλό.
GitOps:- Κρατήστε μανιφέστο ως πηγή της αλήθειας? Argo CD/Flux για Kubernetes, αλλά βασικά σμήνη/πρωτόγονα μέσω Terraform.
9) Πρότυπα για το Kubernetes, δίκτυα, βάσεις δεδομένων
9. 1 Kubernetes
Terraform: σμήνη EKS/GKE/AKS, κόμβοι, IAM, Stories Class, LB.
Μη αποδεκτό: AMI/προετοιμασία προμαχώνα, συγκρότημα εικόνας/αποθετήρια, μετά την εγκατάσταση (ξυλοκόποι/πράκτορες/Otel).
9. 2 Δίκτυα και περίμετρος
Terraform: VPC/subnets/NAT/Transit-Gateway/WAF, διαδρομές.
Anable: NGINX/Απεσταλμένος/HAProxy config, TLS, WAF refig.
9. 3 Βάσεις/κρύπτες/ουρές αναμονής
Παράμετρος ομάδας RDS/CloudSQL, Redis/ElastiCache, Kafka/MSK.
Πρόσθετο: προθέρμανση της μνήμης, θέσεις εργασίας για τη μετανάστευση, δημιουργία εφεδρειών/πρακτόρων.
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. Anable - postgresql-πελάτης ρόλος (θραύσμα)
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. Anable - 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» σε κλειδί μόνο ανάγνωσης. δημιουργεί ένα εισιτήριο όταν υπάρχει απόκλιση.
Anable - έλεγχος προγραμματισμένος για κρίσιμους ρόλους (τρόπος ελέγχου).
Εκθέσεις: αποτυχημένες πολιτικές OPA/Conftest, ανεπίσημοι/εφεδρικοί/πόροι παρακολούθησης.
12) Παρατηρησιμότητα και λογιστικός έλεγχος
'terraform application' logs and planet articacts - εκτός από την αποθήκευση αντικειμένων.
Επιλέξιμο: 'callback _ plugins' (json) → κεντρικό αρχείο καταγραφής/ELK; περιλαμβάνουν ταυτότητα εργασίας, δέσμευση SHA, trace_id.
Μετρήσεις: χρόνος εκτέλεσης σχεδίων/βιβλίων αναπαραγωγής, συχνότητα αλλαγών, κάλυψη δοκιμών.
13) Ασφάλεια
Ενότητα/υπογραφή ρόλων ή σταθερές ετικέτες/hashes.
Ελάχιστα δικαιώματα IAM («σχέδιο» ≠ «εφαρμογή»), διαχωρισμός των ρόλων της CI και της ανθρώπινης εφαρμογής.
Κρυπτογράφηση κρατικών/κορμοτεμαχίων, ιδιωτικών μητρώων ενοτήτων/ρόλων.
Πολιτική «χωρίς μυστικά απλών κειμένων στη VCS», μυστικοί σαρωτές (gitleaks/trufflehog).
14) Αντι-μοτίβα
Μια μονάδα τέρατος Terraform «για τα πάντα», ελλείπουσες εκδόσεις μονάδων.
Τοπικό 'terraform. tfstate 'και καμία κλειδαριά.
Χειροκίνητες επεξεργαστές στο νέφος πάνω από το IaC → αιώνια μετατόπιση.
Το Anable 'shel /' command' αντί για modules (σπάει την ταυτότητα).
Απογραφή «σε ένα αρχείο» χωρίς ομάδες/μεταβλητές, ανάμειξη prod/στάδιο.
Μυστικά σε vars/αποθετήρια, απουσία Vault/KMS.
Εφαρμογή χωρίς σχέδιο και χωρίς αξιολόγηση από ομότιμους.
15) Κατάλογος ελέγχου εφαρμογής (0-45 ημέρες)
0- 10 ηµέρες
Ρύθμιση απομακρυσμένης υποστήριξης/κλειδώματος, επέκταση μονάδων Terraform.
Ενεργοποίηση tfsec/tfsec/checkov, anable-lint; διαπραγμάτευση ετικετών/ετικετών πόρων.
Δημιουργία αναγνώσιμων ρόλων για NGINX/πράκτορες/ξυλοκόπους. οργανώνουν απογραφές.
11-25 ημέρες
Προσθήκη Conftest/OPA, Terratest και Molecule για κρίσιμες μονάδες/ρόλους.
CI: «σχέδιο» για MR, τεχνούργημα σχεδίου, χειροκίνητη εφαρμογή με έγκριση· Γωνιακό στάδιο '--ελέγχου'.
Ενσωμάτωση μυστικής αποθήκευσης (Vault/KMS/Secrets Manager).
26-45 ημέρες
Αυτόματο πρόγραμμα ανίχνευσης μετατοπίσεων, εκθέσεις πολιτικής.
Κατάλογος ενοτήτων/ρόλων με έκδοση. 'README. md 'σε κάθε ένα.
GitOps: σημειώσεις εκλύσεων, συνδυασμός με πύλες παρακολούθησης και συναγερμού.
16) Μετρήσεις διάρκειας
% περιβάλλοντος με απομακρυσμένη κατάσταση και κλειδαριές = 100%.
Το μερίδιο των συστοιχιών/ρόλων με δοκιμές (Terratest/Molecule) ≥ 70%.
Ο μέσος χρόνος εφαρμογής του MR είναι ώρες και όχι ημέρες.
Μηδέν «χειροκίνητη μετατόπιση» (όλες οι αλλαγές περνούν από MR).
Το 100% των κρίσιμων πόρων καλύπτονται από την πολιτική ως κώδικας (ετικέτες, κρυπτογράφηση, εφεδρικά μέσα).
17) Συμπέρασμα
Η Terraform προσδιορίζει μια προβλέψιμη, επαναλαμβανόμενη βάση υποδομής. Το Anable φέρνει τους οικοδεσπότες και τις υπηρεσίες στο επιθυμητό κράτος. Προσθήκη πολιτικής ως κώδικα, απομακρυσμένη κατάσταση με τοποθεσία, δοκιμές, μυστική διαχείριση και CI/CD με plan→review→apply - και ο βρόχος σας IaC γίνεται διαχειρίσιμος, ασφαλής και γρήγορος, και οι κυκλοφορίες είναι ατομικές και αναστρέψιμες.