본문 바로가기

Leave a note/Tools

Ansible (앤시블)

반응형
SMALL

Ansible은 시스템 인프라 자동화 도구로,  여러 서버와 장비를 한 번에 자동화하고 관리하는 것이 목적.
여러 서버의 관리 작업을 쉽게 처리하고, 서버 설정, 애플리케이션 배포, 네트워크 장비 구성 등 반복적인 작업을 자동화를 하기 위한 도구
예를 들어, 10대의 서버에 동일한 소프트웨어를 설치하거나, 네트워크 장비의 설정을 일괄적으로 변경할 때 Ansible을 사용하면 모든 작업을 자동으로 처리할 수 있습니다. 서버와 장비에 대한 대량 작업을 효율적으로 수행할 수 있다는 것

주요 특징

Agentless(에이전트리스): 대상 서버에 별도의 소프트웨어(에이전트)를 설치할 필요 없이, SSH를 사용하여 원격 서버와 통신으로 쉽게 설정하고 실행

YAML 기반의 가독성 높은 문법: 작업 정의 파일(플레이북)은 YAML 형식으로 작성되어 가독성 높고, 직관적

멱등성(Idempotency) 보장: Ansible의 작업은 멱등성을 갖기 때문에, 동일한 작업을 여러 번 실행해도 시스템 상태는 항상 동일하게 유지됩니다.

 

구성

인벤토리(Inventory)

Ansible은 관리할 서버들을 인벤토리 파일로 관리합니다, 즉 인벤토리는 관리할 서버들을 정의한 목록을 의미.
인벤토리 파일은 서버의 IP 주소나 호스트명을 정의하고, 서버들을 그룹으로 나누어 관리할 수 있습니다. 기본 인벤토리 파일은 /etc/ansible/hosts에 위치

# ini 또는 yml 파일로 구성 가능하고 아래는 webserver / dbserver 그룹 예시이고, Ansible은 서버 그룹별로 작업을 나누어 실행 가능

# .ini
[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com

# .yml
all:
  children:
    webservers:
      hosts:
        web1:
          ansible_host: 192.168.1.101
        web2:
          ansible_host: 192.168.1.102
    dbservers:
      hosts:
        db1:
          ansible_host: 192.168.1.201

플레이북(Playbook)

플레이북은 실행할 작업을 정의한 파일이고, Ansible에서의 핵심 개념으로, 여러 작업을 단계별로 작성 가능 → YAML 형식으로 작성 가능하고, 어떤 작업을 어떤 서버에서 어떻게 실행할지를 정의

플레이북 예시: 웹서버 그룹에 속한 모든 서버에 Apache 웹 서버를 설치하는 작업을 수행

# 플레이북 파일 (web-setup.yml) - 웹 서버 설정 자동화
- name: 웹 서버 설정
  hosts: webservers
  become: yes  # sudo 권한 사용
  vars:
    http_port: 80
    max_clients: 200
  
  tasks:
    - name: nginx 설치
      apt:
        name: nginx
        state: present
        update_cache: yes
    
    - name: nginx 설정 파일 복사
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: restart nginx
    
    - name: nginx 서비스 시작
      service:
        name: nginx
        state: started
        enabled: yes
    
    - name: 방화벽 포트 열기
      ufw:
        rule: allow
        port: "{{ http_port }}"
        proto: tcp
  
  handlers:
    - name: restart nginx
      service:
        name: nginx
        state: restarted

hosts: webservers: 웹 서버 그룹에 속한 서버들에 대해 작업을 수행합니다.
vars: 변수(http_port, max_clients)를 정의하여 재사용성을 높입니다.
tasks: 각각의 작업을 정의합니다. 예를 들어, nginx 설치, 설정 파일 복사, 방화벽 포트 열기 등이 있습니다.
handlers: 특정 조건(예: 설정 파일이 변경됨)이 충족되면 실행되는 작업을 정의합니다. 여기서는 nginx를 재시작하는 핸들러가 설정되어 있습니다.

모듈(Module)

Ansible은 다양한 모듈을 제공하여 여러 작업을 쉽게 실행할 수 있도록 합니다. 모듈은 각각의 작업을 실행하는 단위로, 서버에 패키지를 설치하거나 파일을 복사하는 등의 작업을 처리합니다.

apt: 패키지 관리 모듈
copy: 파일 복사 모듈
service: 서비스 시작/중지 모듈

플레이북에서 모듈 사용 예시:  copy 모듈을 사용해 로컬 파일을 원격 서버에 복사하는 작업을 정의

tasks:
  - name: 파일 복사
    copy:
      src: /local/path/file.txt
      dest: /remote/path/file.txt

핸들러(Handlers)

특정 조건이 충족되면 실행되는 작업. 예를 들어, 서버의 설정 파일이 변경되면 서비스를 다시 시작해야 할 때, 핸들러를 통해 자동으로 서비스를 재시작할 수 있습니다.

 

핸들러 예시: 설정 파일이 복사되면 서비스 재시작 핸들러가 호출되어 apache2 서비스가 재시작

tasks:
  - name: 설정 파일 복사
    copy:
      src: /local/path/to/file
      dest: /etc/myconfig
    notify: 서비스 재시작
handlers:
  - name: 서비스 재시작
    service:
      name: apache2
      state: restarted

템플릿(Template)

동적으로 구성 파일을 생성하는 데 사용. 서버마다 다른 설정 값을 적용해야 할 때, 이를 직접 일일이 작성하는 것은 번거롭고 비효율적인 작업이 되는데. Jinja2 템플릿 엔진을 사용해 이러한 문제를 해결.
템플릿 파일 내에 변수를 포함시켜, 특정 서버나 서비스에 맞는 설정 값을 자동으로 채워 넣어서 구성 파일을 자동 생성할 수 있음

 

템플릿 파일 예시 : 서버마다 **max_clients**나 http_port 값이 다를 수 있기 때문에, 이를 템플릿 파일에 변수로 설정해 두고, Ansible이 이 값을 자동으로 채워 넣도록

# templates/nginx.conf.j2
events {
    worker_connections {{ max_clients }};
}
http {
    server {
        listen {{ http_port }};
        # 추가 설정...
    }
}

# playbook 에서 활용 예시
- name: nginx 설정 파일 생성
  template:
    src: templates/nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  vars:
    max_clients: 1024
    http_port: 80

위 템플릿 파일에서는 **{{ max_clients }}**와 **{{ http_port }}**라는 변수를 사용하고 있습니다. Ansible 플레이북을 실행할 때, 각 서버에 맞는 값을 이 변수 자리에 자동으로 넣어줍니다.

template 모듈은 템플릿 파일을 읽어 서버에 맞는 설정 파일을 생성합니다.
vars 섹션에 지정된 max_clientshttp_port 값이 템플릿의 해당 변수 자리로 들어갑니다.

 

역할(Role)

작업을 구조화하고, 여러 서버나 서비스에 재사용할 수 있도록 조직하는 방법입니다. 역할을 사용하면, 복잡한 작업을 모듈화하고 표준화할 수 있습니다. 즉, 작업, 핸들러, 템플릿, 변수 등을 역할 단위로 묶어 관리함으로써 코드의 재사용성과 유지보수성을 높일 수 있습니다.
역할은 주로 여러 파일과 디렉토리로 구성되어 있습니다. 이러한 구조화된 방식 덕분에 작업을 더 잘 관리할 수 있습니다.

역할(Role) 디렉토리 구조 예시:

roles/
  webserver/          # 역할 이름
    tasks/            # 실행할 작업을 정의하는 디렉토리
      main.yml        # 역할에서 실행할 주요 작업
    handlers/         # 서비스 재시작 같은 핸들러 정의
      main.yml        # 핸들러 정의 파일
    templates/        # 템플릿 파일을 저장하는 디렉토리
      nginx.conf.j2   # nginx 설정을 위한 템플릿 파일
    vars/             # 역할에 필요한 변수 정의
      main.yml        # 변수 정의 파일
    defaults/         # 기본값을 정의하는 파일
      main.yml        # 기본 변수 값


# playbook 활용 예시
- hosts: webservers
  roles:
    - webserver

tasks/main.yml: 역할에서 실행할 작업(Tasks)을 정의합니다.
handlers/main.yml: 특정 이벤트가 발생하면 실행할 작업(핸들러)을 정의합니다. 예를 들어, 설정 파일이 변경되면 nginx 서비스를 다시 시작하는 작업을 핸들러로 정의할 수 있습니다.
templates/nginx.conf.j2: 동적으로 설정 파일을 생성하는 템플릿 파일을 포함할 수 있습니다.
vars/main.yml: 해당 역할에 필요한 변수들을 정의하는 파일입니다.
defaults/main.yml: 역할에서 사용하는 변수들의 기본값을 정의할 수 있습니다.

roles 섹션에 webserver 역할을 지정하면, 해당 역할에 포함된 tasks, handlers, templates, vars 등의 파일들이 자동으로 실행됩니다.
이로 인해 플레이북이 간결해지고, 여러 서버에서 같은 역할을 반복적으로 재사용할 수 있습니다.

주요 Ansible 명령어

# 인벤토리의 모든 서버에 대해 ping 테스트
ansible all -i inventory.yml -m ping

# 플레이북 실행
ansible-playbook -i inventory.yml web-setup.yml

# 특정 태그만 실행 (예: nginx 관련 작업만 실행)
ansible-playbook -i inventory.yml web-setup.yml --tags "nginx"

... # 지속적으로 추가​

 

반응형
LIST

'Leave a note > Tools' 카테고리의 다른 글

Querypie  (0) 2024.11.11
[툴] 각종 유틸리티 페이지  (0) 2023.02.01
[SourceTree] 소스트리 SSH Clone  (2) 2020.08.06
[기타툴] Eclipse - JAVA ( JDK ) 2개이상 사용하기  (2) 2019.11.18
[기타툴] VS CODE - SVN 연동 2  (0) 2019.09.12