[Ansible] Ansible tutorial(2) - Playbook

들어가며

ansible-playbook을 사용하여 여러 서버에 작업해야 하는 부분을 하나의 스크립트를 통해서 쉽게 해결할 수 있었다.

그렇지만 각 서버마다 설정 값도 다르고, 서로 다른 yaml에서 공통되는 부분도 있고 다른 부분도 있을 때 Roles를 통해서 모듈화하여 여러 yaml에서 사용할 수 있도록 알아보자.

Roles

  • ansible과 ansible-playbook은 차이가 있다.
  • ansible은 바로 명령을 실행한다는 것과 ansible-playbook은 yaml을 실행 한다.
  • 따라서 yaml에 자신이 실행하고자 하는 프로세스를 작성한다고 생각하면 된다.

Directory structure

a.yml
b.yml
roles/
    pinpoint-config/
        tasks/
        handlers/
        files/
        templates/
        vars/
        defaults/
        meta/
  • pinpoint-config라는 설정이 a.yaml, b.yaml에서 사용된다고 가정해보자.
  • ansible-playbook을 실행하는 폴더에서 roles/pinpoint-config/tasks/main.yml에 설정된 tasks를 읽어서 적용해 준다.
  • 여러 yaml에서 사용되는 설정들을 role로 관리하게 되면 여러 yaml에서 쉽게 사용할 수 있게 된다.
  • copy & paste 를 줄이고 수정 하다가 실수를 줄일 수 있으니 얼마나 대단한 기능 인가!

Using roles

---
- hosts:
    - all
  vars:
    deploy_root: /home/deploy
    pinpoint_config_root: "/conf/pinpoint"
  roles:
    - pinpoint-config
  • a.yml에서는 사용하려는 roles를 넣어주기만 하면 쉽게 설정을 할 수 있다.

Roles 구조

  • roles 하위에 폴더를 여러개 설정할 수 있다.
  • tasks, handlers, defaults, vars, files, templates, meta를 설정할 수 있다.
  • 대부분 사용하는 것은 tasks, files, templates 정도가 사용될거라 생각한다.

tasks

  • 하려는 task에 대해서 작성하는 부분이다.
  • main.yml은 필수로 존재해야 한다.

files

  • static files을 모아놓는 폴더이다.

templates

  • .jinja2로 끝나는 파일들을 이용해 vars로 동적 파일을 생성 할때 사용한다.

Jinja2

  • ansible은 동적으로 template을 생성하기 위해서 jinja2를 사용한다.

문법

  • {{ … }} : 변수를 사용할 때 사용
  • 해당 post의 title은 {{ title }} 이다.
해당 post의 title은 [Ansible] Ansible tutorial(2) - Playbook 이다.
  • {% … %} : if, for문 같은 제어문을 사용할 때 사용
  • 제어문(if)
    • if, elif, else, endif를 사용해서 제어문을 사용할 수 있다.
    • if, endif는 필수이다.
  • 반복문(for ~ in)
    • for item in list, endfor를 사용해서 반복문을 사용할 수 있다.

마치며

  • jekyll을 이용하니 jinja2에서 사용하는 문법이랑 같아 표현을 하려니 없는 값으로 표시 된다.
  • 예전에 한번 사용했을 때는 엄청 복잡하다고 느껴졌는데, 지금와서 공부해보니 생각보다 쉬운 내용인거 같다.
  • 역시 눈으로 볼때랑 직접 해본 다음의 차이가 큰거 같다.

Leave a comment