728x90
반응형

Ansible Usage

Ansible 개요

Ansible 이란?

인프라 관리를 코드 기반으로 자동화하는 도구
Infrastructure as Code (IaC), IT 인프라를 코드 기반으로 자동 설치 및 구축/관리/프로비저닝 하는 프로세스
자동 구축/관리 하려는 원격 인프라에 무언가 명령을 전달하는 방식으로 동작

Ansible 특징

  1. Agentless: SSH 기반 원격서버 명령 전달
  2. 접근용이성: YAML 형식의 Playbook(명령모음집)
  3. 멱등성: 여러번 수행해도 같은 결과를 얻는 성질

Ansible 구성요소

  1. Controller 서버
    • Ansible 명령을 여러 원격 서버에 전달하는 주체
  2. Inventory(Ansible hosts)
    • 원격서버들의 목록
    • /etc/ansible/hosts
    • ansible -i 옵션으로 inventory file 지정 가능
  3. Playbook
    • 명령들을 모아둔 명령집

Ansible 구성도

graph TD
    A[Ansible] -->|SSH| B[원격 서버 1]
    A -->|SSH 명령| C[원격 서버 2]
    A -->|SSH 명령| D[원격 서버 3]

    subgraph Inventory
        E[원격 서버 목록]
        E --> B
        E --> C
        E --> D
    end

    subgraph Playbook
        F[명령 모음집]
    end

    A --> E
    A --> F

Mermaid Diagram: Chrome Extension - Markdown Diagrams 설치

Markdown Diagrams

Ansible 설치

$ sudo apt install ansible
$ ssh-keygen # 개인키/공개키 생성
$ ssh-copy-id [account]@[host] # 관리하고자 하는 원격서버, 비번없이 로그인

Ansible Inventory 구성

  1. 전역 설정(/etc/ansible/hosts)
    • 사용법: ansible all -m shell -a "ls -al"
  2. 로컬 설정(/path/to/inventory.ini)
    • 사용법: ansible all -i /path/to/inventory.ini -m shell -a "ls -al"

Ansible Inventory 예시(gillilabmall)

# host - 개별 서버명(/etc/hosts)
gillilab-backoffice # scm
gillilab-backend1 # backend
gillilab-backend2 # backend
gillilab-api1 # parneters api
gillilab-api2 # parneters api

# all - 모든 서버 그룹
[all]
gillilab-backoffice # scm
gillilab-backend1 # backend
gillilab-backend2 # backend
gillilab-api1 # parneters api
gillilab-api2 # parneters api

# backend group - 백엔드 서버 그룹
[gillilab_backend]
gillilab-backend1
gillilab-backend2

# api group - api 서버 그룹
[gillilab_api]
gillilab-api1
gillilab-api2

# scm deploy group - scm 서버 그룹(해당 그룹의 경우 scm이 api 서버에도 구성됨)
[gillilab_scm]
gillilab-backoffice
gillilab-api1
gillilab-api2

Ansible 명령 구조

ansible [host 또는 host그룹] options
ex) ansible all -m copy -a "src=/test.txt dest=/test.txt" # 로컬파일을 원격서벌그룹으로 복사

  • all: 인벤토리의 all 그룹
  • -m: ansible에서 실행할 모듈(모듈 목록 확인 필요)

Ansible Playbook 설정

ansible 실행에 필요한 Script를 정의
기본적으로 하나의 playbook은 여러개의 task가 들어갈 수 있으며 해당 task가 ansible 명령의 실행 단위

Playbook 예시

---
- name: Network Getting Started First Playbook
  connection: ansible.netcommon.network_cli
  gather_facts: false
  hosts: all # 명령실행 대상 원격서버 그룹
  tasks: # 실행할 task 정의
    - name: Get config for VyOS devices # 하나의 task
      vyos.vyos.vyos_facts:
        gather_subset: all

    - name: Display the config # 2번째 task
      debug:
        msg: "The hostname is {{ ansible_net_hostname }} and the OS is {{ ansible_net_version }}"

Ansible gillilab 적용 실습

위의 인벤토리 참고

Ansible Ad-hoc 쿼리

간단한 명령 실행

# 모든 서버에 접속해서 ~/mmon-docker-gillilab 디렉토리로 이동 후 디렉토리 구조 확인
$ ansible all -m shell -a "cd ~/mmon-docker-gillilab && ls -al"

# API 서버의 부하확인
$ ansible api -m shell -a "w"

Ansible Playbook 적용

  1. Directory 구조
.
├── gillilab
│   ├── backend-deploy.yml # 백엔드 소스 배포
│   ├── inventory.ini # 원격서버 목록
│   ├── partners-api-deploy.yml # api 소스 배포
│   └── scm-deploy.yml # scm 소스 배포
  1. inventory.ini
# gillilab
# host
gillilab-backoffice # scm
gillilab-backend1 # backend
gillilab-backend2 # backend
gillilab-api1 # parneters api
gillilab-api2 # parneters api

# all
[all]
gillilab-backoffice # scm
gillilab-backend1 # backend
gillilab-backend2 # backend
gillilab-api1 # parneters api
gillilab-api2 # parneters api

# backend group
[gillilab_backend]
gillilab-backend1
gillilab-backend2

# api group
[gillilab_api]
gillilab-api1
gillilab-api2

# scm deploy group
[gillilab_scm]
gillilab-backoffice
gillilab-api1
gillilab-api2
  1. scm 소스 배포 yaml - scm-deploy.yml
---
- hosts: gillilab_scm
  remote_user: ec2-user
  gather_facts: false
  tasks:
    - name: scm source deploy
      # shell: cd ~/mmon-docker-gillilab/src/scm && ls
      shell:
        cmd: ls -al # 실행할 명령 => 해당 명령을 배포 명령으로 변경
        chdir: ~/mmon-docker-gillilab/src/scm # 작업 디렉토리 이동
      register: "output"

    - debug: var=output.stdout_lines
  1. scm 소스 배포 실행 by) Playbook
rupi@rupi-office:~/Work/playbook/gillilab$ ansible-playbook -i inventory.ini scm-deploy.yml

PLAY [gillilab_scm] ****************************************************************************************************************************************************************************************************************************************************************

TASK [scm deploy chdir=~/mmon-docker-gillilab/src/scm, _raw_params=ls | wc -l] *****************************************************************************************************************************************************************************************************
changed: [gillilab-api1]
changed: [gillilab-api2]
changed: [gillilab-backoffice]

TASK [debug var=output.stdout_lines] *********************************************************************************************************************************************************************************************************************************************
ok: [gillilab-backoffice] => {
    "output.stdout_lines": [
        "28"
    ]
}
ok: [gillilab-api1] => {
    "output.stdout_lines": [
        "28"
    ]
}
ok: [gillilab-api2] => {
    "output.stdout_lines": [
        "28"
    ]
}

PLAY RECAP ***********************************************************************************************************************************************************************************************************************************************************************
gillilab-api1                : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
gillilab-api2                : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
gillilab-backoffice          : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Ansible은 인프라를 코드로 관리하고 자동화하는 데 매우 유용한 도구입니다. Agentless 방식으로 SSH를 통해 원격 서버에 명령을 전달하며, YAML 형식의 Playbook을 사용하여 접근성이 뛰어납니다. 또한 멱등성을 보장하여 여러 번 실행해도 동일한 결과를 얻을 수 있습니다. Ansible의 기본 개념부터 설치, 인벤토리 구성, Playbook 작성 및 실습까지 다루어 보았습니다. 이를 통해 Ansible을 활용한 인프라 자동화의 기초를 다질 수 있기를 바랍니다.

728x90
반응형

+ Recent posts