GH GambleHub

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)。

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)用於角色驗證。
應用後空白測試: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輪廓將變得可管理、安全且快速,並且版本具有原子性和可逆性。

Contact

與我們聯繫

如有任何問題或支援需求,歡迎隨時聯絡我們。我們隨時樂意提供協助!

Telegram
@Gamble_GC
開始整合

Email 為 必填。Telegram 或 WhatsApp 為 選填

您的姓名 選填
Email 選填
主旨 選填
訊息內容 選填
Telegram 選填
@
若您填寫 Telegram,我們將在 Email 之外,同步於 Telegram 回覆您。
WhatsApp 選填
格式:國碼 + 電話號碼(例如:+886XXXXXXXXX)。

按下此按鈕即表示您同意我們處理您的資料。