Ansible vs Terraform 2026๋…„ ์™„๋ฒฝ ๋น„๊ต: IaC์™€ DevOps ๋ฉด์ ‘ ๋Œ€๋น„ ๊ฐ€์ด๋“œ

Ansible๊ณผ Terraform์˜ ์‚ฌ์šฉ๋ฒ•์„ ์ƒ์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์„ ์–ธ์  ๋ฐ ์ ˆ์ฐจ์  ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์ฐจ์ด, ์ƒํƒœ ๊ด€๋ฆฌ, OpenTofu ๋™ํ–ฅ, DevOps ๋ฉด์ ‘์—์„œ ์ž์ฃผ ๋‚˜์˜ค๋Š” ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€ ์˜ˆ์‹œ๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

Ansible vs Terraform 2026๋…„ ์™„๋ฒฝ ๋น„๊ต: IaC์™€ DevOps ๋ฉด์ ‘ ๋Œ€๋น„ ๊ฐ€์ด๋“œ

Ansible๊ณผ Terraform ๋น„๊ต๋Š” DevOps ๋ฉด์ ‘์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ๋‚˜์˜ค๋Š” ์งˆ๋ฌธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์งˆ๋ฌธ์˜ ํ‹€ ์ž์ฒด๊ฐ€ ์˜คํ•ด๋ฅผ ๋‚ดํฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋„๊ตฌ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. Ansible 2.20์€ ๊ตฌ์„ฑ ๊ด€๋ฆฌ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ๋ฅผ ๋‹ด๋‹นํ•˜๊ณ , Terraform 1.15๋Š” ์ธํ”„๋ผ ๋ฆฌ์†Œ์Šค ํ”„๋กœ๋น„์ €๋‹์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋„๊ตฌ๊ฐ€ ๋›ฐ์–ด๋‚œ ์˜์—ญ, ๊ฒน์น˜๋Š” ๋ถ€๋ถ„, ๊ทธ๋ฆฌ๊ณ  ์ƒํ˜ธ ๋ณด์™„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์‹œ๋‹ˆ์–ด DevOps ์—”์ง€๋‹ˆ์–ด๋กœ์„œ์˜ ์—ญ๋Ÿ‰์„ ์ฆ๋ช…ํ•˜๋Š” ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์ฐจ์ด์ 

Terraform์€ ์ธํ”„๋ผ ์ƒํƒœ๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค(VM, ๋„คํŠธ์›Œํฌ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค). Ansible์€ ํ•ด๋‹น ์ธํ”„๋ผ ์œ„์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ๋“ค์„ ์ ˆ์ฐจ์ ์œผ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค(ํŒจํ‚ค์ง€, ์„œ๋น„์Šค, ํŒŒ์ผ). ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋‘ ๋„๊ตฌ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์„ ์–ธ์  vs ์ ˆ์ฐจ์ : ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด

Terraform์€ ์„ ์–ธ์  ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์›ํ•˜๋Š” ์ตœ์ข… ์ƒํƒœ๋ฅผ ๊ธฐ์ˆ ํ•˜๋ฉด Terraform์ด ํ•ด๋‹น ์ƒํƒœ์— ๋„๋‹ฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ์ƒ์„ฑ, ์ˆ˜์ • ๋˜๋Š” ์‚ญ์ œํ•ด์•ผ ํ•˜๋Š” ์ธํ”„๋ผ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

hcl
# main.tf
resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t3.medium"
  
  tags = {
    Name        = "web-server"
    Environment = "production"
  }
}

resource "aws_security_group" "web" {
  name        = "web-sg"
  description = "Allow HTTP and HTTPS"
  
  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

terraform apply๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฆฌ์†Œ์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋‘ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ชจ๋‘ ์ƒ์„ฑํ•˜๊ณ , ๊ตฌ์„ฑ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์—†์ด ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด ์ž‘์—…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Terraform์€ ๊ตฌ์„ฑ์„ ์ƒํƒœ ํŒŒ์ผ๊ณผ ๋น„๊ตํ•˜์—ฌ ๋ณ€๊ฒฝ์ด ํ•„์š” ์—†์Œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Ansible์€ ์ ˆ์ฐจ์  ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒœ์Šคํฌ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. Ansible ๋ชจ๋“ˆ์€ ์ข…์ข… ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ€์ง€์ง€๋งŒ(๋‘ ๋ฒˆ ์‹คํ–‰ํ•ด๋„ ๊ฐ™์€ ๊ฒฐ๊ณผ), Playbook ์ž์ฒด๋Š” ์ตœ์ข… ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ์•ก์…˜์˜ ์ˆœ์„œ๋ฅผ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค.

yaml
# webserver.yml
- name: Configure web server
  hosts: webservers
  become: true
  
  tasks:
    - name: Install nginx
      ansible.builtin.apt:
        name: nginx
        state: present
        update_cache: true
    
    - name: Copy nginx configuration
      ansible.builtin.template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: Restart nginx
    
    - name: Ensure nginx is running
      ansible.builtin.service:
        name: nginx
        state: started
        enabled: true
  
  handlers:
    - name: Restart nginx
      ansible.builtin.service:
        name: nginx
        state: restarted

๊ฐ ํƒœ์Šคํฌ๋Š” ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. notify/handler ํŒจํ„ด์€ ์„ ์–ธ์ ์ธ ๋™์ž‘์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. handler๋Š” ํŠธ๋ฆฌ๊ฑฐ๋œ ํšŸ์ˆ˜์™€ ๊ด€๊ณ„์—†์ด ๋งˆ์ง€๋ง‰์— ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ƒํƒœ ๊ด€๋ฆฌ: ๋ฉด์ ‘์˜ ํ•ต์‹ฌ ์ฃผ์ œ

Terraform์€ ์ƒํƒœ ํŒŒ์ผ์„ ์œ ์ง€ํ•˜์—ฌ ๊ตฌ์„ฑ์„ ์‹ค์ œ ๋ฆฌ์†Œ์Šค์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ƒํƒœ๋Š” ๋ฆฌ์†Œ์Šค ID, ์˜์กด์„ฑ, ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๊ฐ€ ์—†์œผ๋ฉด Terraform์€ ๋ฌด์—‡์ด ์กด์žฌํ•˜๊ณ  ๋ฌด์—‡์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š”์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ด€์ TerraformAnsible
์ƒํƒœ ์ €์žฅ์†Œํ•„์ˆ˜(๋กœ์ปฌ ํŒŒ์ผ ๋˜๋Š” ์›๊ฒฉ ๋ฐฑ์—”๋“œ)๊ธฐ๋ณธ์ ์œผ๋กœ ์—†์Œ
๋“œ๋ฆฌํ”„ํŠธ ๊ฐ์ง€terraform plan์œผ๋กœ ๋‚ด์žฅ๋ช…์‹œ์  ๊ฒ€์‚ฌ ํ•„์š”
๋ฆฌ์†Œ์Šค ์ถ”์ ์ƒํƒœ๋ฅผ ํ†ตํ•ด ์ž๋™์ธ๋ฒคํ† ๋ฆฌ ๊ธฐ๋ฐ˜
๋กค๋ฐฑ์ƒํƒœ์—์„œ ์‚ญ์ œ ํ›„ ์žฌ์ƒ์„ฑ๋„ค์ดํ‹ฐ๋ธŒ ๋กค๋ฐฑ ์—†์Œ

Ansible์—๋Š” ๋™๋“ฑํ•œ ์ƒํƒœ ํŒŒ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ ์‹œ์Šคํ…œ์— ์—ฐ๊ฒฐํ•˜์—ฌ ํƒœ์Šคํฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ํ˜„์žฌ ์‹œ์Šคํ…œ ์ƒํƒœ์™€ ๋ชจ๋“ˆ์˜ ๋ฉฑ๋“ฑ์„ฑ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด Ansible์€ ์‹œ์ž‘ํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ๋ณ€๊ฒฝ ์ถ”์ ์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋ฉด์ ‘์—์„œ ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ ์ค‘ ํ•˜๋‚˜๋Š” ์ƒํƒœ ํŒŒ์ผ ๋ณด์•ˆ์ž…๋‹ˆ๋‹ค. Terraform ์ƒํƒœ์—๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋น„๋ฐ€๋ฒˆํ˜ธ, API ํ‚ค, ๋ฆฌ์†Œ์Šค ์‹๋ณ„์ž ๋“ฑ. ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ์—์„œ๋Š” ์ƒํƒœ๋ฅผ ์›๊ฒฉ(S3, Azure Blob, Terraform Cloud)์— ์•”ํ˜ธํ™” ๋ฐ ์ ‘๊ทผ ์ œ์–ด์™€ ํ•จ๊ป˜ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

hcl
# backend.tf
terraform {
  backend "s3" {
    bucket         = "company-terraform-state"
    key            = "prod/infrastructure.tfstate"
    region         = "us-east-1"
    encrypt        = true
    dynamodb_table = "terraform-locks"
  }
}

DynamoDB ํ…Œ์ด๋ธ”์€ ์ž ๊ธˆ์„ ์ œ๊ณตํ•˜์—ฌ ๋‘ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋™์‹œ์— ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ๋„๊ตฌ์˜ ์‚ฌ์šฉ ์‹œ๊ธฐ

Terraform์€ ํด๋ผ์šฐ๋“œ ์ธํ”„๋ผ ํ”„๋กœ๋น„์ €๋‹์— ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค: ๊ฐ€์ƒ ๋จธ์‹ , ๊ด€๋ฆฌํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ, IAM ์—ญํ• , VPC. ๋ฆฌ์†Œ์Šค ๊ฐ„ ์˜์กด์„ฑ์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ผ๊ด€๋œ HCL ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ๋ชจ๋“  ์ฃผ์š” ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Ansible์€ ๊ธฐ์กด ์‹œ์Šคํ…œ ๊ตฌ์„ฑ์— ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค: ํŒจํ‚ค์ง€ ์„ค์น˜, ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋ฐฐํฌ, ๋ฉ€ํ‹ฐ ์Šคํ… ๋ฐฐํฌ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜. SSH(Windows์˜ ๊ฒฝ์šฐ WinRM)๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•˜๋ฉฐ ๋Œ€์ƒ ๋จธ์‹ ์— ์—์ด์ „ํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ค‘๋ณต ์˜์—ญ์ด ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค VM์— ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Terraform์€ provisioners๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ํ›„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Ansible์€ amazon.aws.ec2_instance์™€ ๊ฐ™์€ ๋ชจ๋“ˆ์„ ํ†ตํ•ด ํด๋ผ์šฐ๋“œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ ๋„๊ตฌ๋ฅผ ๊ฐ•์  ์™ธ์˜ ์˜์—ญ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์ง€๋ณด์ˆ˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ”ผํ•ด์•ผ ํ•  ์•ˆํ‹ฐํŒจํ„ด

Terraform provisioner๋ฅผ ๊ตฌ์„ฑ ๊ด€๋ฆฌ์— ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ทจ์•ฝํ•œ ์ธํ”„๋ผ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. Provisioner๋Š” ์ƒ์„ฑ ์‹œ์—๋งŒ ์‹คํ–‰๋˜๊ณ  ์ดํ›„ apply์—์„œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธํ”„๋ผ์—๋Š” Terraform์„, ๊ตฌ์„ฑ์—๋Š” Ansible์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ํ†ตํ•ฉ ์›Œํฌํ”Œ๋กœ์šฐ

๋Œ€๋ถ€๋ถ„์˜ ์กฐ์ง์—์„œ๋Š” ๋‘ ๋„๊ตฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Terraform์ด ์ธํ”„๋ผ๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•˜๊ณ  ์—ฐ๊ฒฐ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. Ansible์ด ํ•ด๋‹น ์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

hcl
# outputs.tf
output "web_server_ips" {
  value       = aws_instance.web[*].private_ip
  description = "Private IPs of web servers"
}

output "db_endpoint" {
  value       = aws_rds_instance.main.endpoint
  description = "RDS endpoint for application config"
}

CI/CD ํŒŒ์ดํ”„๋ผ์ธ์€ ๋จผ์ € Terraform์„ ์‹คํ–‰ํ•˜๊ณ  ์ถœ๋ ฅ์„ ์บก์ฒ˜ํ•œ ๋‹ค์Œ, Ansible ์ธ๋ฒคํ† ๋ฆฌ๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์ƒˆ ์ธํ”„๋ผ์— ๋Œ€ํ•ด Playbook์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

yaml
# ansible/inventory/aws_ec2.yml
plugin: amazon.aws.aws_ec2
regions:
  - us-east-1
filters:
  tag:Environment: production
  instance-state-name: running
hostnames:
  - private-ip-address
groups:
  webservers: "'web' in tags.Role"
  databases: "'db' in tags.Role"

์ด ๋™์  ์ธ๋ฒคํ† ๋ฆฌ๋Š” AWS์— ์ง์ ‘ ์ฟผ๋ฆฌํ•˜์—ฌ ํƒœ๊ทธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋™ IP ๊ด€๋ฆฌ๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

DevOps ๋ฉด์ ‘ ์ค€๋น„๊ฐ€ ๋˜์…จ๋‚˜์š”?

์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ, flashcards, ๊ธฐ์ˆ  ํ…Œ์ŠคํŠธ๋กœ ์—ฐ์Šตํ•˜์„ธ์š”.

OpenTofu: ํŒ๋„๋ฅผ ๋ฐ”๊พผ ํฌํฌ

HashiCorp๋Š” 2023๋…„ 8์›”์— Terraform์„ Business Source License(BSL) ํ•˜์— ์žฌ๋ผ์ด์„ ์Šคํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” Terraform 1.5๋ฅผ OpenTofu๋กœ ํฌํฌํ–ˆ์œผ๋ฉฐ, ํ˜„์žฌ Linux Foundation ์‚ฐํ•˜์—์„œ ํ˜ธ์ŠคํŒ…๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

2026๋…„ 8์›” ํ˜„์žฌ, OpenTofu 1.11.6์€ ๋Œ€๋ถ€๋ถ„์˜ Terraform ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ๋“œ๋กญ์ธ ๋Œ€์ฒด๋กœ ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ HCL ๊ตฌ๋ฌธ, ๋™์ผํ•œ ํ”„๋กœ๋ฐ”์ด๋” ์—์ฝ”์‹œ์Šคํ…œ, ๋™์ผํ•œ ์ƒํƒœ ํฌ๋งท์ž…๋‹ˆ๋‹ค. OpenTofu๋Š” Terraform ์˜คํ”ˆ์†Œ์Šค ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์—†๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค: ์ƒํƒœ ์•”ํ˜ธํ™”, provider for_each, ์กฐ๊ธฐ ๋ณ€์ˆ˜ ํ‰๊ฐ€ ๋“ฑ์ž…๋‹ˆ๋‹ค.

๋ฉด์ ‘ ์ค€๋น„๋ฅผ ์œ„ํ•ด ๋ผ์ด์„ ์Šค ์ฐจ์ด๋ฅผ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. BSL์€ ๋‚ด๋ถ€ ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ๊ฒฝ์Ÿ ์ œํ’ˆ ๊ตฌ์ถ•์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๋ฒค๋” ์ข…์†์„ฑ์„ ์šฐ๋ คํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์ปดํ”Œ๋ผ์ด์–ธ์Šค ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ๋Š” ์กฐ์ง์€ OpenTofu์˜ MPL 2.0 ๋ผ์ด์„ ์Šค๋ฅผ ์„ ํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2024๋…„ 12์›” IBM์˜ HashiCorp ์ธ์ˆ˜๋Š” ๋ฒค๋” ๊ด€๊ณ„ ๋…ผ์˜์— ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

DevOps ๋ฉด์ ‘ ๋นˆ์ถœ ์งˆ๋ฌธ

Q: Ansible๋กœ Terraform์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํšจ๊ณผ์ ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Ansible์€ ํด๋ผ์šฐ๋“œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒํƒœ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ Playbook์„ ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜๋ฉด ์ค‘๋ณต ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Terraform์˜ ์ƒํƒœ ํŒŒ์ผ์€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ ํ•˜๊ณ  ์ตœ์†Œํ•œ์˜ ๋ณ€๊ฒฝ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Ansible์€ ์žฅ์ ์ธ ๊ตฌ์„ฑ ๊ด€๋ฆฌ์— ์‚ฌ์šฉํ•˜์„ธ์š”.

Q: Terraform์—์„œ ์‹œํฌ๋ฆฟ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?

์‹œํฌ๋ฆฟ์„ ๋ฒ„์ „ ๊ด€๋ฆฌ์— ์ปค๋ฐ‹ํ•˜์ง€ ๋งˆ์„ธ์š”. ํ™˜๊ฒฝ ๋ณ€์ˆ˜, Vault ํ†ตํ•ฉ ๋˜๋Š” ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด ์‹œํฌ๋ฆฟ ๋งค๋‹ˆ์ €๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋กœ๊ทธ์— ํ‘œ์‹œ๋˜์ง€ ์•Š๋„๋ก ๋ณ€์ˆ˜๋ฅผ sensitive๋กœ ํ‘œ์‹œํ•˜์„ธ์š”:

hcl
# variables.tf
variable "db_password" {
  type        = string
  sensitive   = true
  description = "Database password from Vault or environment"
}

Q: Ansible์˜ ๋ฉฑ๋“ฑ์„ฑ์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ฉฑ๋“ฑ์  ์ž‘์—…์€ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•˜๋“  ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•˜๋“  ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. apt ๋ชจ๋“ˆ๊ณผ state: present๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์—†์œผ๋ฉด ์„ค์น˜ํ•˜๊ณ  ์ด๋ฏธ ์„ค์น˜๋˜์–ด ์žˆ์œผ๋ฉด ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉฑ๋“ฑ์  Playbook์„ ์ž‘์„ฑํ•˜๋ฉด ๋ฐ˜๋ณต ์‹คํ–‰ ์‹œ ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Q: ์ธํ”„๋ผ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๊นŒ?

Terraform: terraform validate๋กœ ๊ตฌ๋ฌธ ๊ฒ€์‚ฌ, terraform plan์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, Terratest์™€ ๊ฐ™์€ ๋„๊ตฌ๋กœ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์‹คํ–‰. Ansible: ansible-lint๋กœ ๋ฌธ์ œ ๊ฐ์ง€, --check ๋ชจ๋“œ๋กœ ๋“œ๋ผ์ด๋Ÿฐ ์‹คํ–‰, Molecule๋กœ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด role ํ…Œ์ŠคํŠธ.

Terraform ๋ฉด์ ‘ ์ค€๋น„๋ฅผ ๋” ๊นŠ์ด ํ•˜๋ ค๋ฉด Terraform ๋ฉด์ ‘ ์งˆ๋ฌธ: Infrastructure as Code ์™„๋ฒฝ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. Terraform ๊ธฐ์ดˆ ๋ฐ Ansible ๊ตฌ์„ฑ ๊ด€๋ฆฌ ๋ชจ๋“ˆ์—์„œ ์‹ค์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „ ํ˜ธํ™˜์„ฑ๊ณผ ์—์ฝ”์‹œ์Šคํ…œ

2026๋…„ 8์›” ํ˜„์žฌ ์•ˆ์ • ๋ฒ„์ „:

๋„๊ตฌ๋ฒ„์ „์ถœ์‹œ์ผ์ฃผ์š” ๊ธฐ๋Šฅ
Ansible2.20.52026๋…„ 4์›”์ปฌ๋ ‰์…˜ ๊ด€๋ฆฌ ๊ฐœ์„ 
Terraform1.15.82026๋…„ 7์›”Windows ARM64 ์ง€์›, convert ํ•จ์ˆ˜
OpenTofu1.11.62026๋…„ 4์›”์ƒํƒœ ์•”ํ˜ธํ™”, provider for_each

Ansible์˜ ์ปฌ๋ ‰์…˜ ์•„ํ‚คํ…์ฒ˜๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ํ”„๋กœ๋ฐ”์ด๋”๋ณ„ ๋ชจ๋“ˆ์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. amazon.aws ์ปฌ๋ ‰์…˜์€ Ansible ์ฝ”์–ด์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋Š” CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ฒ„์ „ ๊ณ ์ •์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

Terraform์˜ ํ”„๋กœ๋ฐ”์ด๋” ๋ฒ„์ „ ๊ด€๋ฆฌ๋„ ์œ ์‚ฌํ•œ ์›์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ž ๊ธˆ ํŒŒ์ผ(terraform.lock.hcl)์€ ํŒ€ ๊ตฌ์„ฑ์›๊ณผ CI ์‹œ์Šคํ…œ ๊ฐ„์— ์ผ๊ด€๋œ ํ”„๋กœ๋ฐ”์ด๋” ๋ฒ„์ „์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

hcl
# versions.tf
terraform {
  required_version = ">= 1.15.0"
  
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.60"
    }
  }
}

์„ ํƒ ๊ธฐ์ค€: ์˜์‚ฌ๊ฒฐ์ • ํ”„๋ ˆ์ž„์›Œํฌ

์งˆ๋ฌธ์€ "Ansible์ด๋ƒ Terraform์ด๋ƒ"๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์งˆ๋ฌธ์€ "์–ด๋–ค ๋„๊ตฌ๊ฐ€ ์–ด๋–ค ์ฑ…์ž„์„ ๋‹ด๋‹นํ•˜๋А๋ƒ"์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์‚ฌ๋ก€๊ถŒ์žฅ ๋„๊ตฌ
VM, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๋„คํŠธ์›Œํฌ ํ”„๋กœ๋น„์ €๋‹Terraform
OS ๊ตฌ์„ฑ, ํŒจํ‚ค์ง€ ์„ค์น˜Ansible
Kubernetes ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌTerraform ๋˜๋Š” kubectl ๋ฐ Helm
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋ฐฐํฌAnsible ๋˜๋Š” CI/CD ๋„ค์ดํ‹ฐ๋ธŒ
IAM ์—ญํ•  ๋ฐ ์ •์ฑ… ์ƒ์„ฑTerraform
์„œ๋ฒ„์˜ ์‚ฌ์šฉ์ž ๊ณ„์ • ๊ด€๋ฆฌAnsible
๋ชจ๋‹ˆํ„ฐ๋ง ์ธํ”„๋ผ ๊ตฌ์ถ•Terraform(๋ฆฌ์†Œ์Šค ์ƒ์„ฑ) + Ansible(์—์ด์ „ํŠธ ๊ตฌ์„ฑ)

์ด๋Ÿฌํ•œ ๋„๊ตฌ๊ฐ€ ์ตœ์‹  ๋ฐฐํฌ ์›Œํฌํ”Œ๋กœ์šฐ์— ์–ด๋–ป๊ฒŒ ์ ํ•ฉํ•œ์ง€์— ๋Œ€ํ•œ ์ „์ฒด ๊ทธ๋ฆผ์€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๋ฉด์ ‘ ์งˆ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์‹œ๋‹ˆ์–ด ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์•Œ์•„์•ผ ํ•  Ansible๊ณผ Terraform

  • Terraform์€ ์ธํ”„๋ผ ์ƒํƒœ๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , Ansible์€ ์‹œ์Šคํ…œ์„ ์ ˆ์ฐจ์ ์œผ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋„๊ตฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•œ ์ธํ”„๋ผ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ์ƒํƒœ ํŒŒ์ผ ๋ณด์•ˆ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Terraform ์ƒํƒœ๋Š” ์•”ํ˜ธํ™”์™€ ์ž ๊ธˆ์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์›๊ฒฉ์— ์ €์žฅํ•˜์„ธ์š”.
  • OpenTofu๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” MPL ๋ผ์ด์„ ์Šค Terraform ๋Œ€์•ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉฑ๋“ฑ์„ฑ์€ ์ž๋™์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฐ˜๋ณต ์‹คํ–‰์—์„œ ์ผ๊ด€๋œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” Playbook์„ ์ž‘์„ฑํ•˜์„ธ์š”.
  • ๋™์  ์ธ๋ฒคํ† ๋ฆฌ๋กœ ์ˆ˜๋™ ํ˜ธ์ŠคํŠธ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ธํ”„๋ผ์— ๋Œ€ํ•ด ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์— ์ง์ ‘ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฒ„์ „ ๊ณ ์ •์œผ๋กœ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. Terraform์—์„œ ํ”„๋กœ๋ฐ”์ด๋” ๋ฒ„์ „์„ ์ž ๊ทธ๊ณ , Ansible์—์„œ ์ปฌ๋ ‰์…˜ ๋ฒ„์ „์„ ๊ณ ์ •ํ•˜์„ธ์š”.
  • ์ธํ”„๋ผ ์ฝ”๋“œ ํ…Œ์ŠคํŠธ๋Š” ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค: ๋ณ€๊ฒฝ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์— terraform plan, Ansible ๋“œ๋ผ์ด๋Ÿฐ์— --check ๋ชจ๋“œ, ๋‘ ๋„๊ตฌ ๋ชจ๋‘์— ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์—ฐ์Šต์„ ์‹œ์ž‘ํ•˜์„ธ์š”!

๋ฉด์ ‘ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์™€ ๊ธฐ์ˆ  ํ…Œ์ŠคํŠธ๋กœ ์ง€์‹์„ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.

์˜ค๋Š˜์˜ ์ฑŒ๋ฆฐ์ง€

DevOps ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‚˜์š”

์‹ค์ œ ์ฝ”๋“œ ํ•œ ์กฐ๊ฐ, ์ˆจ์€ ๋ฒ„๊ทธ ํ•˜๋‚˜, ํ•˜๋ฃจ ํ•œ ๋ฒˆ. ๊ณ„์ • ์—†์ด ๋ฐ”๋กœ ๋„์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Anthony Fillion-Maillet

์ž‘์„ฑ์ž

Anthony Fillion-Maillet

SharpSkill ์ฐฝ์—…์ž

10๋…„ ์ด์ƒ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์„ ํ•ด์™”์Šต๋‹ˆ๋‹ค. SharpSkill์„ ์šด์˜ํ•˜๋ฉฐ ์ด๊ณณ์— ๊ฒŒ์‹œ๋˜๋Š” ๋ชจ๋“  ๋‚ด์šฉ์— ์ฑ…์ž„์„ ์ง‘๋‹ˆ๋‹ค.

2026๋…„ 8์›” 22์ผ ์—…๋ฐ์ดํŠธ

๊ณต์œ 

๊ด€๋ จ ๊ธฐ์‚ฌ

Docker Compose 2026: ๋ฉ€ํ‹ฐ ์ปจํ…Œ์ด๋„ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋„คํŠธ์›Œํ‚น, DevOps ๋ฉด์ ‘ ์งˆ๋ฌธ

Docker Compose 2026: ๋ฉ€ํ‹ฐ ์ปจํ…Œ์ด๋„ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋„คํŠธ์›Œํ‚น, DevOps ๋ฉด์ ‘ ์งˆ๋ฌธ

Docker Compose๋ฅผ ํ™œ์šฉํ•œ ๋ฉ€ํ‹ฐ ์ปจํ…Œ์ด๋„ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ• ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์„ค์ •, ๋ณผ๋ฅจ ๊ด€๋ฆฌ, ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ํŒจํ„ด๊ณผ DevOps ๋ฉด์ ‘์—์„œ ์ž์ฃผ ์ถœ์ œ๋˜๋Š” ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

Kubernetes Helm Charts 2026 ํŠœํ† ๋ฆฌ์–ผ ๋ฐ ๋ฉด์ ‘ ์งˆ๋ฌธ

Kubernetes Helm Charts ์™„๋ฒฝ ๊ฐ€์ด๋“œ 2026: ํŒจํ‚ค์ง•, ๋ฐฐํฌ, ๋ฉด์ ‘ ์งˆ๋ฌธ

Helm 3์„ ์‚ฌ์šฉํ•œ Kubernetes ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒจํ‚ค์ง•๊ณผ ๋ฐฐํฌ ๋ฐฉ๋ฒ•์„ ์ƒ์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ฐจํŠธ ๊ตฌ์กฐ, ํ…œํ”Œ๋ฆฟ ์ž‘์„ฑ, ์˜์กด์„ฑ ๊ด€๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์ˆ  ๋ฉด์ ‘์—์„œ ์ž์ฃผ ๋‚˜์˜ค๋Š” ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

Prometheus vs Grafana vs Datadog monitoring comparison for DevOps interviews

Prometheus vs Grafana vs Datadog 2026: ๋ชจ๋‹ˆํ„ฐ๋ง ์•„ํ‚คํ…์ฒ˜ ๋น„๊ต์™€ DevOps ๋ฉด์ ‘ ํ•ต์‹ฌ ์งˆ๋ฌธ

2026๋…„ Prometheus, Grafana, Datadog ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋ฅผ ์•„ํ‚คํ…์ฒ˜, ์ฟผ๋ฆฌ ์–ธ์–ด, ์•Œ๋ฆผ ์ „๋žต, ๋น„์šฉ, Kubernetes ํ†ตํ•ฉ ๊ด€์ ์—์„œ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. DevOps ๋ฐ SRE ๋ฉด์ ‘ ๋นˆ์ถœ ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.