Infrastructure as Code: Terraform, Ansible
Infrastructure as Code: Terraform, Ansible
1)為什麼IaC和工具有何不同
Terraform-聲明性的orchestrator-IaC:通過提供商創建/修改雲基礎設施(VPC,K8s,LB,DB,IAM)。管理資源生命周期並存儲狀態。
Ansible-過程配置-IaC和配置管理:配置主機/軟件(軟件包、文件、服務),了解應用程序調試、播放和步驟編排。無代理(SSH/WinRM),具有任務等效性。
組合:Terraform-「平臺由何而來」,Ansible-「如何配置和運行」。
2)存儲庫和圖層的結構
我們推薦3層:1.基金會(著陸區):網絡,IAM,KMS,基本期刊/監視。
2.平臺:Kubernetes集群,基地,隊列,觀察堆棧。
3.Workloads:空間/空間,服務帳戶,政策,configs.
Repo:- '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個狀態(狀態)
遠程後端(S3/GCS+DynamoDB/LockTable)+鎖定。
周圍分開: 'prod。tfstate`, `staging.tfstate`.
狀態漂移:按時間表在CI中的「terraform plan」;漂移時的異常。
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相似性
在可能的情況下使用模塊(不使用「外殼」)。
幹運行的「changed_when'/'check_mode」。
手柄僅在更改時反射。
5)秘密和偽裝
Terraform:通過「sensitive=true」分泌值;秘密本身-不在狀態(存儲在AWS Secrets Manager/HashiCorp Vault/KMS中,並引用數據源)。
Ansible:用於變量加密的Vault(「ansible-vault encrypt」),與HashiCorp Vault/KMS集成。
GitOps:在單獨的回購/存儲中的秘密,通過least-privilege訪問。
6)政策與合規性(政策即代碼)
OPA/Conftest for Terraform Planns:禁止SG開放的公共S3、未消耗的資源(標簽)。
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)用於角色驗證。
應用後空白測試:HTTP probes,端口/過程,權限。
8) CI/CD и GitOps
管道(在Pull/Merge Request上):1.Lint/Sec: tflint, tfsec/checkov, ansible-lint.
2.計劃:「terraform計劃」,其中包含人工制品的發布(MR中的評論)。
3.Policy Gate: Conftest/Sentinel.
4.Apply (manual/approved):僅在帶有工件簽名的主頁上。
5.Ansible deploy:舞臺上的「--check」,然後舞臺上的「--diff」。
6.Post-checks: 合成/Probe, dashboard發布註釋。
GitOps:
將宣言作為真理的來源;Argo CD/Flux用於Kubernetes,但基本集群/原語是通過Terraform進行的。
9)Kubernetes,網絡,DB的模式
9.1 Kubernetes
Terraform: EKS/GKE/AKS群集、節點、IAM、StorageClass, LB。
Ansible:準備AMI/堡壘、映像/存儲庫、安裝後 (日誌記錄器/代理程序/OTel)。
9.2個網絡和外圍
Terraform:VPC/子網/NAT/Transit-Gateway/WAF,路線。
不可能:NGINX/Envoy/HAProxy、TLS、WAF configs規則。
9.3個基地/緩存/隊列
Terraform:RDS/CloudSQL參數組,Redis/ElastiCache,Kafka/MSK。
Ansible:加熱緩存、進行遷移、設置備份/代理。
10)Configs示例
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客戶端角色(片段)
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」;分散時會產生滴答聲。
Ansible -check是關鍵角色(審計模式)的時間表。
報告:未執行OPA/Conftest策略,無標簽/備份/監視資源。
12)可觀察性和審計
「terraform apply」徽標和計劃工件-保存到對象存儲中。
Ansible:「callback_plugins」(json)→ 中央日誌/ELK;包括job ID、commit SHA、trace_id。
度量標準:計劃/播放時間、更改頻率、測試覆蓋範圍。
13)安全性
模塊/角色簽名或固定標簽/哈希。
最低限度的IAM權利(「計劃」≠「應用」),將CI和人類應用者的角色分開。
狀態/邏輯加密,模塊/角色私有註冊表。
VCS中的「no plaintext secrets」策略,密碼掃描儀(gitleaks/trufflehog)。
14)反模式
單個Terraform怪物模塊「全部」;沒有模塊版本。
本地'terraform。tfstate"和沒有鎖定。
IaC頂部的雲端手動編輯→永恒的漂移。
Ansible 「shell」/「command」代替模塊(打破冪等)。
無組/變量的「單一文件」清單,prod/stage混合。
vars/存儲庫中的秘密,缺少Vault/KMS。
沒有計劃或沒有同行評審的應用。
15)實施清單(0-45天)
0-10天
配置遠程後端/鎖定,分解Terraform模塊。
啟用tflint/tfsec/checkov,ansible-lint;商定資源標簽/標簽。
為NGINX/Agent/Logers擔任Ansible角色;安排庫存。
11-25天
為關鍵模塊/角色添加Conftest/OPA、Terratest和Molecule。
CI: MR上的「計劃」,計劃的人工制品,帶有應用程序的手動應用程序;Ansible `--check` на stage.
保密-存儲集成(Vault/KMS/Secrets Manager)。
26-45天
Drift探測器計劃中的自動計劃,策略報告。
具有轉換的模塊/角色目錄;README文檔。每個人都有md'。
GitOps:版本註釋,監視捆綁和警報門。
16)成熟度量
具有遠程狀態和湖泊的環境的百分比為100%。
具有測試(Terratest/Molecule)的模塊/角色比例≥ 70%。
從MR到apply (prod)的平均時間是小時,不是天。
零「手動漂移」(所有更改均通過MR進行)。
100%的關鍵資源由Policy as Code(標簽、加密、備份)覆蓋。
17)結論
Terraform設置了可預測,可重復的基礎架構;Ansible使主機和服務達到所需的狀態。添加Policy as Code、具有位置的遠程狀態、測試、秘密管理和CI/CD和plan→review→apply-並且您的IaC輪廓將變得可管理、安全且快速,並且版本具有原子性和可逆性。