Ansible Overview

Overview


이번 포스팅은 Provision & Configuration Management Tool 중의 하나인 Ansible에 대해서 공유합니다.

Ansible은 DevOps의 용도로 서버 환경 구축, WAS 배포 등에 사용되는 Python 기반의 툴 입니다.

최근 업무 중 10대 이상의 vm에 nginx 설치와 ssl 환경 구축, java, monitor tool 설치, demonize 툴을 설치해야 하는 일이 있었습니다.

처음에는 10대이지만 추후 같은 설정으로 더 많은 서버를 구축해야하는 상황이었습니다.

기존 회사에서 지원해주는 DevOps 툴에서는 ssl과 같은 세세한 설정에 대한 부분에 대해 설정할 수 없었기 때문에, Ansible을 통해 약간의 등록만으로 쉽게 해결하였습니다.

또한 설정을 git에 저장하여 언제든 다시 세팅할 수 있도록 준비해 두었습니다.

그럼 이런 Ansible의 동작과 구성에대해 정리해 보겠습니다.

Install

설치는 매우 간단합니다. python 기반이기 때문에 python -> easy_intall -> pip -> ansible 순으로 brew를 통해 설치하면 됩니다.

Component

table 출처:IBM

Ansible을 도식화 하면 위 이미지와 같습니다. Ansible은 기본적으로 YAML 파일을 이용하여 정보를 저장하는데,

대상 서버에 정보를 Hosts Inventory.yml, 어떠한 Provision을 할지에 대한 명세를 Playbook.yml 에 작성하여 사용합니다.

Hosts의 예시는 아래와 같습니다.

all:
  children:
    example_hosts:
      hosts:
        test.host.ip1:
        test.host.ip2:

host 그룹의 이름을 children 하위에 작성하고 hosts: 아래에 실제 host ip를 입력합니다.

Playbook의 예시는 아래와 같습니다

example_server_alpha.xml

---
- hosts: example_hosts
  remote_user: test
  vars:
    sever_name: hosts-alpha
  roles:
    - initialize
    - nginx
    - nginx-conf-simple
    - java
  tasks:
    - include: tasks/example_hosts/supervisored.yml
  ...

접근할 host, 유저명, 사용할 변수 이름과 동작에대한 정의가 기록되어 있습니다.

Group_Vars, Role, Task, Template…

각각의 설정들은 디렉토리 기반으로 관리됩니다.

/ /hosts /ALPHA /BETA - inventory.xml /group_vars

  • example_service.xml /roles /java /task /template … /task
  • example_service.xml /templates
  • test.j2 example_service_alpha.xml

#groups_var

groups_var는 실행되는 playbook에 사용되는 변수를 저장 됩니다. group_var는 phase와 관계없이 모든 hosts에 적용됩니다.

각각의 변수는 when: 등의 조건문이나 후에 설명되는 template에 사용 될 수 있습니다.

아래는 예시입니다. yml 형태로 저장됩니다.

jar_prefix: "test"
service_code: "test"
is_API: True

#role & task

task는 playbook에 기록하기에 조금 크거나 묶어서 재사용하기 위한 목록입니다.

role은 task의 묶음입니다.

#template

jinja2를 이용하여 sh 파일등을 서버 환경에따라 다르게 설치할 수 있습니다. 또한 if, for 등 간단한 로직도 적용할 수 있습니다.

예시는 아래와 같습니다.

#!/bin/sh

PORT=
MANAGEMENT_PORT=20080
JAR_PATH=/module//.jar
LOG_PATH=//${PORT}

Vault

pem과 같은 보안 파일에 대한 정보를 ansible에서 제공하는 vault를 통해 암호화 할 수 있습니다.

암호화 된 파일은 playbook 실행시 복호화 되어 사용됩니다.

암호화는 아래와 같이 간단한 커맨드를 통해 실행 할 수 있습니다.

ansible-vault encrypt ${fileaname}

#plan text

example text …

#encrypted text

$ANSIBLE_VAULT;1.2;AES256;dev 37636561366636643464376336303466613062633537323632306566653533383833366462366662 65653530633030653038313…

##excute

설정이 완료되었다면 아래와 같이 간단한 커멘드로 서버구축을 할 수 있게 됩니다.

ansible-playbook example_hosts_alpha.yml

Adventage

ssh를 이용한 간단하면서 빠른 다수의 서버접근, gruop_vars, roles, tasks등의 명확한 동작에 대한 개념, jinja2를 이용한 template 파일 생성 기능이 주된 장점입니다.

여러번 실행을 해도 공통된 결과인 멱등성을 가집니다.

Disadventage

os 설치와 같은 아주 기본적인 서버세팅은 불가능합니다.

Comments