인프라/Ansible

[정리] Ansible 개념 정리

seungdols 2017. 7. 27. 20:23

Ansible

ansible을 사용 할 때, 알아야 할 것들

Playbook은 무엇인가?

플레이북은 애드혹 테스트 실행 모드와는 완벽하게 다른 사용방법이며 특히 강력한 사용 방법입니다. 간단히 말해 플레이북은 정말 간단하게 설정을 관리하고 다수의 머신에 대한 배포 시스템에 대한 기본적인 단위입니다. 기존에 존재해왔던것과 달리 복잡한 어플리케이션 형태의 배포에 매우 적합합니다.

플레이북은 설정을 정의할 수 있으며 특정 머신의 집합을 오가며 다른 작업을 수행하도록 수동으로 작업 순서를 설정하는것도 가능합니다. 이때에 작업은 동기 또는 비동기로 수행할 수 있습니다.

/usr/bin/ansible 명령을 통한 애드혹 테스크를 실행하는것에 반해 플레이북은 소스 컨트롤을 통해 보관하거나 당신의 설정을 내보내거나 원격 시스템을 구성하는데 보장되는데 더욱 적합합니다.

플레이북을 통해 이러한 기술들을 구현하는 방법은 Ansible-Example 저장소에 정리가 되어있습니다. 이것들을 함께 확인해보길 추천합니다.


  ---
  - hosts: webservers
    vars:
      http_port: 80
      max_clients: 200
    remote_user: root
    tasks:
    - name: ensure apache is at the latest version
      yum: name=httpd state=latest
    - name: write the apache config file
      template: src=/srv/httpd.j2 dest=/etc/httpd.conf
      notify:
      - restart apache
    - name: ensure apache is running (and enable it at boot)
      service: name=httpd state=started enabled=yes
    handlers:
      - name: restart apache
        service: name=httpd state=restarted
playbook은 yaml format으로 표현한다. 또한, playbook은 리스트 안에 하나 또는 그 이상의 plays를 포함할 수 있다.

play의 목적은 잘 정의된 roles들을 host의 그룹들에 잘 매핑 시키는 것과 ansible에서 task로 부르는 것을 표현하는 것이다.

다수의 plays를 포함하고 있는 playbook은 다중 머신에 배포하는 조정작업, 웹 서버 그룹에 있는 모든 머신들을 특정 단계별로 실행하거나, 데이터베이스 서버 그룹에서 특정 단계를 실행하는 것 또는 그 이상의 웹 서버들 그룹 등등에 뒤에서 명령을 할 수 있다.

task가 무엇인가?

play는 task의 목록을 가질 수 있으며, task는 modules들을 호출하게 된다. tasks는 연속적으로 실행 한다.

task에 대한 설명을 보려면, 링크를 클릭하면, 도큐먼트 페이지로 간다.

각 태스크의 목표는 매우 구체적인 인수를 사용하여 모듈을 실행하는 것입니다. 위에서 언급 한 변수는 모듈에 대한 인자로 사용될 수 있습니다.

modules는 멱등성을 지원해야 하고, 여러번 실행 되나, 단 한 번 실행되나 같은 결과를 가져야 한다. 다만, command나 shell의 경우에는 동작이 아예 되지 않을 수도 있다. 그러나, chomod / setsebool 같은 것들은 써도 무방하다.

모든 task들은 name을 포함하고 있어야 하마, 해당 결과는 playbook의 결과에 포함 된다.

이는 사람이 결과를 읽을 수 있으며, 각 task 단계마다 좋은 설명이 된다. 만약 name을 쓰지 않으면, action에 추가한 문자열이 결과에 사용 된다.

Role은 무엇인가?

ansible의 role은 playbook에서 다양한 서버 설정에 대한 그룹을 role로 나눌 수 있도록 하는 구분자 개념이라고 생각하면 쉬울 것 같다.

이를테면, api, pc, mobile서버 셋팅을 해야하는데, 미묘하게 다른 셋팅들을 어떻게 관리 할 것 인가? 이럴때에 roles/api, roles/pc, roles/mobile등으로 디렉토리로 구분짓고 그 하위에 필요한 handler, tasks, templates, vars, files의 디렉토리로 구분하고 각각 역할에 맞게 yaml을 짜두면, pc, api, mobile의 환경을 구성해준다. 이를테면, 역할의 분리를 위함이다. (한 번에 다 관리하면, 꼬이기 마련이다.) 다만, 중복인 경우는 common으로 따로 분리해두면 좋다.

Handler는 무엇인가?

어떤 설정을 한 뒤, 서비스나 이벤트를 등록 해야하는데 이럴때 쓰는것이 Handler이며, 이것등을 사용하려면, 아무래도 init.d 하위에 서비스 실행 파일이 있어야 할 것 같고, 그게 아니면 이 곳에 yaml파일로 command, shell명령을 때리면 될 것 같다.



반응형