본문 바로가기

Dev Ops/Ansible

Ansible이란 무엇인가?

Ansible이란 Redhat에서 운영중인 오픈소스 IT 자동화 툴입니다. 프롭비져닝, 구성관리, 배포, 오케스트레이션 등의 수동 작업을 자동화 해줍니다.

https://www.ansible.com/

 

Ansible is Simple IT Automation

Ansible is the simplest way to automate apps and IT infrastructure. Application Deployment + Configuration Management + Continuous Delivery.

www.ansible.com

위는 Ansible의 공식 홈페이지입니다. Ansible은 Red Hat이란 유명한 회사로부터 관리되고 있습니다.

https://docs.ansible.com/

 

Ansible Documentation

Ansible Automation Controller Documentation Access the best of Ansible innovation with hardening and support from Red Hat. Learn how the elements of the Automation Controller work together with Red Hat Ansible Automation Platform to centralize and control

docs.ansible.com

Ansible의 자세한 사용법 및 기능은 위의 문서에 자세하게 나와있습니다.

Ansible은 언제 사용하지?

Hadoop을 설치하거나 운영하는 상황에서는, 여러대의 서버에 동일한 명령어를 입력해야하는 경우가 많습니다.

예를 들어, 6대의 서버에 Java 8을 설치해야한다면 다양한 방법이 있을 것입니다.

  1. 서버에 한 대씩 접속해서, Java8을 설치한다.
  2. Iterm과 같은 Command Broadcasting을 이용하여 6개의 window에 명령어를 입력한다.
  3. Tmux를 이용한다.
  4. Ansible의 Inventory와 PlayBook을 이용한다.

저는 그동안, 2번 방식을 주로 사용해왔습니다. 그런데 서버의 대수가 늘어나는 경우 2번 방식은 적절하지 않습니다. 만약 명령어를 입력해야할 서버가 100개라면 100개의 윈도우를 띄워야하고 모니터의 공간은 한정적이기 때문입니다.

 

Ansible은 이론상으로 모든 터미널 명령어를 수행할 수 있습니다. 

또한, Chef나 Puppet처럼 모든 호스트에 Agent를 설치하지 않아도 됩니다. 왜냐하면, Ansible은 SSH로 동작하기 때문입니다.

 

우선 Ansible은 내부적으로 SSH로 동작하기 때문에, 22번 포트가 허용되어있어야 하고 비밀번호 없이 통신하기 위해서는 대상 서버에 Ansible을 실행할 서버의 공개키가 저장되어있어야 합니다.

구성요소

인벤토리 (inventory)

인벤토리는, 작업을 할 서버 리스트를 관리하는 파일입니다. .ini 또는 .yml 파일로 만들 수 있고 두 가지 모두 많이 사용되고, 문법은 조금 차이가 있으니 편한 파일로 만들면 됩니다.

 

.ini 형식

[myvirtualmachines]
192.0.2.50
192.0.2.51
192.0.2.52

.yml 형식

 

leafs:
  hosts:
    leaf01:
      ansible_host: 192.0.2.100
    leaf02:
      ansible_host: 192.0.2.110

yml파일에는 정규표현식을 사용해 규칙성이 있는, hostname이나 fqdn을 효율적으로 표현할 수 도 있습니다. 예를들아

abcd-001,abcd-002,abcd-003 .. abcd-099 라는 99대의 서버가 있다면 모두 적지 않고

abcd-0[01:99]로 표현가능합니다.

 

Ansible 설치시 기본 인벤토리는 /etc/ansible/hosts 이고, 인벤토리를 따로 만들어서 관리할 수 도 있습니다.

플레이북 (Playbook)

플레이북은 실제 명령어를 작성하는 파일입니다. 이 또한 yml 파일 형식으로 작성할 수 있습니다.

- name: My first play
  hosts: virtualmachines
  tasks:
   - name: Ping my hosts
     ansible.builtin.ping:
   - name: Print message
     ansible.builtin.debug:
       msg: Hello world

위와같이 핑을 체크하는 간단한 PlayBook을 작성할 수 있습니다.

ansible-playbook -i inventory.yaml playbook.yaml

그리고 ansible-playbook 명령어로, inventory와 playbook을 인자로 넘겨주어 실행하면 inventory에 등록된 서버를 대상으로, ping을 체크하는 스크립트가 실행되게 됩니다. 그리고 아래와 같은 output이 터미널에 남습니다.

PLAY [My first play] **********************************************************************

TASK [Gathering Facts] ********************************************************************
ok: [vm01]
ok: [vm02]
ok: [vm03]

TASK [Ping my hosts] **********************************************************************
ok: [vm01]
ok: [vm02]
ok: [vm03]

TASK [Print message] **********************************************************************
ok: [vm01] => {
    "msg": "Hello world"
}
ok: [vm02] => {
    "msg": "Hello world"
}
ok: [vm03] => {
    "msg": "Hello world"
}

PLAY RECAP ********************************************************************************
vm01: ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
vm02: ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
vm03: ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0