본문 바로가기
C.W.K.
Stream
Lesson 04 of 08 · published

Ansible playbook — YAML 의 idempotent ops

~10 min · yaml, ansible, automation

Level 0평문
0 XP0/64 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

Task 리스트로서의 서버 설정

Ansible playbook 은 play 를 YAML 로 죽 늘어놓은 거야. play 하나는 host 를 정하고 그 위에서 돌릴 task 들을 담아. 런타임이 host 마다 SSH 로 들어가서 task 를 순서대로 돌리는데, 몇 번을 돌려도 결과가 같아. 이미 설정이 끝난 host 에 playbook 을 다시 돌리면 바꿀 게 없는 task 는 그냥 넘어가.

다섯 핵심 섹션

  • hosts: — inventory 의 어느 그룹을 대상으로 삼을지 정해.
  • vars: — 이 playbook 범위의 변수야. vars/ 파일에서 끌어와도 돼.
  • tasks: — 순서대로 도는 작업들이야. 하나하나가 module 호출 (apt:, copy:, systemd:) 에 파라미터를 붙인 형태고.
  • handlers: — task 의 notify: 가 부르면 깨어나. 여러 번 불려도 play 가 끝날 때 한 번만 돌아.
  • roles: — task 와 변수, 파일, template 을 한 덩어리로 묶어 재사용하는 단위야.

Inventory — host 파일

Inventory 는 YAML 로도 INI 로도 쓸 수 있고, 클라우드 API 플러그인으로 동적으로 만들 수도 있어. YAML inventory 는 host 를 그룹으로 묶으면서 변수까지 같이 얹어줘.

원칙: Ansible 의 값어치는 몇 번을 돌려도 결과가 같다는 데 있어. 잘 쓴 task 는 '이 명령을 실행해라' 가 아니라 '이런 상태였으면 좋겠다' 를 적어. shell: 이나 command: 로 내려가기 전에 전용 module (apt:, file:, systemd:) 부터 찾아. 전용 module 은 '이미 그렇게 돼 있네' 를 알아보고 건너뛸 줄 알거든.

Code

작은 playbook·yaml
---
- name: Configure web servers
  hosts: web
  become: true
  vars:
    nginx_user: www-data
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present
        update_cache: true

    - name: Deploy nginx config
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        owner: root
        mode: '0644'
      notify: Restart nginx

    - name: Ensure nginx is running
      systemd:
        name: nginx
        state: started
        enabled: true

  handlers:
    - name: Restart nginx
      systemd:
        name: nginx
        state: restarted
YAML inventory·yaml
all:
  children:
    web:
      hosts:
        web1.example.com:
        web2.example.com:
      vars:
        nginx_workers: 4
    db:
      hosts:
        db1.example.com:
          ansible_user: postgres
Playbook 실행·bash
# Dry run (--check)
ansible-playbook -i inventory.yaml site.yaml --check

# 적용
ansible-playbook -i inventory.yaml site.yaml

# web task 만 실행
ansible-playbook -i inventory.yaml site.yaml --limit web

# 디버깅 verbose
ansible-playbook -i inventory.yaml site.yaml -vvv

External links

Exercise

최근에 서버에서 손으로 처리한 일을 하나 떠올려봐. 패키지 설치든, config 배포든, systemd service 설정이든. 그걸 task 세 개짜리 Ansible play 로 옮겨 써. 테스트 host 에 --check 로 돌려보고. dry-run 이 무엇이 바뀔지 정확히 미리 알려주는 걸 봐. 그 리포트 하나가 이 방식으로 얻는 이득이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.