코드로서의 인프라: Terraform, Ansible
코드로서의 인프라: Terraform, Ansible
1) IaC와 도구의 차이점
선언적 오케 스트레이터 -IaC: 공급자를 통해 클라우드 인프라 (VPC, K8, LB, DB, IAM) 를 생성/수정합니다. 리소스 라이프 사이클 및 저장 상태를 관리합니다.
불가능한-절차 적 설정 -IaC 및 구성 관리: 호스트/소프트웨어 (패키지, 파일, 서비스) 를 구성하고 응용 프로그램 제공, 템플릿, 단계 조정 방법을 알고 있습니다. 작업의 dempotency가없는 에이전트 (SSH/WinRM) 가 없습니다.
조합: Terraform- "플랫폼으로 만들어진 것", Ansible - "구성 및 시작 방법".
2) 저장소 및 레이어의 구조
3 개의 레이어를 권장합니다
1. 재단 (랜딩 존): 네트워크, IAM, KMS, 기본 로그/모니터링.
2. 플랫폼: Kubernetes 클러스터, 데이터베이스, 대기열, 관찰 가능성 스택.
3. 워크로드: 공간/네임 스페이스, 서비스 계정, 정책, 구성.
- 'ac/terraform/' - 모듈 및 환경 (' 모듈/', 'envs/').
- 'ac/ansible/' - 역할 (' 역할/'), 플레이 북 ('플레이 북/'), 인벤토리 (' 발명/').
- '정책/' -OPA/Conftest 규칙.
- '파이프 라인/' -CI/CD 스크립트 (린트/플랜/적용/테스트).
3) 테라 폼: 모듈, 상태, 환경
3. 모듈 1 개
작고 재사용 된: 'vpc', 'eks', 'rds', '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 주
원격 백엔드 (S3/GCS + DynamoDB/LockTable) + 잠금 장치.
환경별 분리: 'prod. tfstate '', 스테이징. tfstate '.
국가 드리프트: 예정된 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 작업 공간/엔보스
옵션:- 별도의 디렉토리 'envs/prod', 'envs/stage' (비주얼).
- 가벼운 변형을위한 작업 공간이지만 비밀을 혼합하지 마십시오
- 'tfvars' 를 통한 매개 변수: 'prod. tfvars ',' 무대. tfvars '.
4) 불가능한: 역할, 재고, 이데올로기
4. 역할 및 플레이 북 1 개
갤럭시 표준:
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 개
'재고/prod/호스트. yml '+ 변수' 그룹 _ vars/host _ vars '.
동적 인벤토리: 'aws _ ec2', 'gcp _ computure', 'kubernetes. 핵심 '.
4. 3 이념성
가능한 경우 모듈 ('쉘' 이 아님) 을 사용하십시오.
(PHP 3 = 3.0.6, PHP 4)
처리기는 변경 사항에만 반영됩니다.
5) 비밀과 구성
테라 폼: '민감한 = 참' 을 통한 값 분비; 비밀 자체는 상태가 아닙니다 (AWS Secrets Manager/HashiCorp Vault/KMS에 저장하고 데이터 소스를 참조).
Ansible: 가변 암호화 용 Vault ('ansible-vault 암호화'), HashiCorp Vault/KMS와의 통합.
GitOps: 별도의 리포/스토리지의 비밀, 최소 권한으로 액세스 할 수 있습니다.
6) 코드로서의 정책
테라 폼 계획에 대한 OPA/혼란: 공개 S3 금지, 공개 SG, 태그가없는 리소스 (태그).
Terraform Cloud/Enterprise-대안으로 Sentinel.
Ansible 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 테스트
테라 폼: 통합 점검을위한 'tflint', 'tfsec '/' checkov', Terratest (Go).
불가능한: 역할을 테스트하기위한 'ansible-lint', 분자 (+ Docker/Podman/EC2).
적용 후 연기 테스트: TP 프로브, 포트/프로세스, 권리.
8) CI/CD... GitOps
파이프 라인 (풀/병합 요청 중):1. Lint/Sec: tflint, tfsec/checkov, ansible-lint.
2. 계획: 아티팩트 게시와 함께 '테라 폼 계획' (MR의 의견).
3. 정책 게이트: Conftest/Sentinel.
4. 적용 (수동/승인): 아티팩트 서명이있는 메인에서만 가능합니다.
5. 불가능한 배포: 무대에서 '-확인' 한 다음 prod에서 '-diff'.
6. 사후 점검: 신디케이트/프로브, 주석 대시 보드 해제.
GitOps:- 선언문을 진실의 원천으로 유지하십시오. Kubernetes 용 Argo CD/Flux이지만 Terraform을 통한 기본 클러스터/프리미티브.
9) Kubernetes, 네트워크, 데이터베이스 패턴
9. 쿠 베르네 테스 1 명
테라 폼: EKS/GKE/AKS 클러스터, 노드, IAM, StorageClass, LB.
불가능한: AMI/요새 준비, 이미지 조립/리포지토리, 설치 후 (로거/에이전트/OTel).
9. 2 개의 네트워크 및 경계
테라 폼: VPC/서브 넷/USA/Transit-Gateway/WAF, 경로.
불가능한: NGINX/Envoy/HAProxy, SL, WAF 규칙 설정.
9. 3 기지/캐시/대기열
테라 폼: RDS/CloudSQL 그룹 매개 변수, Redis/ElastiCache, Kafka/MSK.
불가능: 캐시 예열, 마이그레이션 작업, 백업/에이전트 설정.
10) 구성 요소의 예
10. 1 테라 폼-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 불가능한-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) 드리프트 및 규정 준수 관리
읽기 전용 키의 주기적 '테라 폼 계획'; 불일치가있을 때 티켓을 만듭니다.
안타깝게도 중요한 역할을 예약했는지 확인하십시오 (감사 모드).
보고서: OPA/Conftest 정책 실패, 태그가없는/백업/모니터링 리소스.
12) 관찰 및 감사
'terraform은' 로그를 적용하고 아티팩트를 계획합니다-객체 저장으로 저장하십시
불가능한: '콜백 _ 플러그인' (json) → 중앙 로그/ELK; 작업 ID, 커밋 www, trace _ id를 포함합니다.
지표: 계획/플레이 북의 실행 시간, 변경 빈도, 테스트 범위.
13) 안전
모듈/역할 서명 또는 고정 태그/해시.
최소 IAM 권리 ('계획' 및 '적용') 는 CI와 휴먼 앱의 역할을 분리합니다.
상태/로그의 암호화, 모듈/역할의 개인 레지스터.
정책 "VCS의 일반 텍스트 비밀 없음", 비밀 스캐너 (gitleaks/trufflehog).
14) 반 패턴
하나의 테라 폼 몬스터 모듈 "모든 것"; 누락 된 모듈 버전.
로컬 테라 폼. tfstate '와 자물쇠가 없습니다.
IaC → 영원한 드리프트를 통해 클라우드의 수동 편집.
모듈 대신 불가능한 '쉘 '/' 명령' (demempotency 중단).
그룹/변수가없는 "하나의 파일에서" 인벤토리로 prod/stage를 혼합합니다.
vars/리포지토리의 비밀, Vault/KMS가 없습니다.
계획없이 그리고 동료 검토없이 신청하십시오.
15) 구현 점검표 (0-45 일)
0-10 일
원격 백엔드/잠금 설정, 테라폼 모듈 확장
tflint/tfsec/checkov, ansible-lint 사용; 리소스 태그/라벨을 협상하십시오.
NGINX/에이전트/로거에 대한 불가능한 역할 만들기; 재고를 구성하십시오.
11-25 일
중요한 모듈/역할을 위해 Conftest/OPA, Terratest 및 Molecule을 추가하십시오.
CI: MR에 대한 '계획', 아티팩트 계획, 약 수동으로 수동 적용; 불가능한 '-확인' не단계.
시크릿 스토리지 통합 (Vault/KMS/비밀 관리자).
26-45 일
드리프트 감지, 정책 보고서에 대한 자동 일정.
버전이 포함 된 모듈/역할 디렉토리; 'README. 각각 md '.
GitOps: 릴리스 주석, 모니터링 및 경보 게이트와의 조합.
16) 성숙도 지표
원격 상태 및 잠금 장치가있는 환경의% = 100%.
테스트 (Terratest/Molecule) 와 모듈/역할의 비율은 70% 이상입니다.
MR에서 적용 (prod) 까지의 평균 시간은 며칠이 아니라 시간입니다.
제로 "수동 드리프트" (모든 변경 사항은 MR을 통과합니다).
중요한 리소스의 100% 는 코드 (태그, 암호화, 백업) 로 정책에 의해 보호됩니다.
17) 결론
Terraform은 예측 가능하고 반복 가능한 인프라 기반을 지정합 Ansible은 호스트와 서비스를 원하는 상태로 가져옵니다. 계획 → 검토 → 적용되는 코드, 위치가있는 원격 상태, 테스트, 비밀 관리 및 CI/CD로 정책을 추가하면 IaC 루프가 관리 가능하고 안전하며 빠르며 릴리스가 원자적이며 가역적입니다.