본문 바로가기
Cloud

[ansible] ansible 사용해보기

by Ahngyuho 2025. 3. 20.

1. IaC(Infrastructure as Code)란?

  • IaC는 인프라(서버, 네트워크, 스토리지 등)를 코드로 관리하는 방법론입니다.
  • 대표적인 장점은 서버 설정, 애플리케이션 설치 등의 작업을 스크립트(코드)로 자동화하여 재현 가능성, 일관성, 확장성을 확보할 수 있다는 점입니다.
  • 멱등성(Idempotency): 여러 번 코드를 실행해도 동일한 결과(상태)를 유지하도록 해주는 성질을 의미합니다.

2. Ansible 소개

  • Ansible은 에이전트(Agent) 설치가 필요 없는 툴로, SSH를 사용해 원격 서버를 관리합니다.
  • Inventory 파일(호스트 목록)과 Playbook(실행할 작업 정의) 두 요소를 중심으로 동작합니다.
  • 별도의 대화형 명령(콘솔 상에서 추가 입력을 계속 요구하는 명령어)을 지양하며, 자동화된 방식으로 명령을 실행합니다.

3. Ansible 설치

우분투/데비안 기준 설치 예시:

apt update
apt install -y ansible-core

 


4. SSH 키 기반 접속 설정

Ansible이 비밀번호 없이 원격 서버에 접속하려면 SSH 키 기반 인증이 필요합니다.

  1. SSH 키 생성일반적으로 ~/.ssh/id_rsa와 ~/.ssh/id_rsa.pub가 생성됩니다.
  2. 키 생성 명령어  ssh-keygen
  3. 원격 서버에 공개키 복사 
    1. ssh-copy-id <사용자>@<원격 서버 IP 또는 호스트명>  
    2. yes를 입력해 호스트를 추가하고, 해당 계정의 비밀번호를 입력하면 공개키가 복사됩니다.
    3. 이후에는 ssh <사용자>@<원격 서버 IP>로 접속해도 비밀번호 입력 없이 로그인이 가능해집니다.
       
       

5. Inventory 파일(호스트 목록) 구성

서버들을 그룹화하여 관리할 수 있는 파일입니다. 

all:
  hosts:
    10.10.10.211:
    10.10.10.212:
    10.10.10.213:
  children:
    master:
      hosts:
        10.10.10.211
    data01:
      hosts:
        10.10.10.212
    data02:
      hosts:
        10.10.10.213
  • all 아래에 전체 호스트를 명시하고, 그 하위에 master, data01, data02 등의 그룹을 구성했습니다.

6. Playbook 작성 및 실행

Playbook은 Ansible에서 실제 작업을 정의하는 YAML 파일입니다. 여러 tasks로 구성되어 있고, 실행 순서대로 원격 서버에서 작업을 수행합니다.

6.1 간단 예시: 특정 파일 생성

- hosts: front
  tasks:
    - name: Test Task
      file:
        path: /home/test/abcd
        state: touch
        owner: test
        group: test
        mode: '0600'
    - name: Test2 Task
      become: yes  # root 권한이 필요한 경우
      file:
        path: /root/abcd
        state: touch
        owner: root
        group: root
        mode: '0600'
  • become: yes를 사용하면 sudo를 통해 root 권한으로 작업을 수행합니다.
  • Playbook을 실행할 때 --ask-become-pass 옵션을 주면 sudo 비밀번호를 물어봅니다.
실행 명령어 
ansible-playbook -i inventory.yml playbook.yml -u <사용자명> --ask-become-pass

6.2 Nginx 설치 예시

- hosts: front
  become: yes
  tasks:
    - name: Install Nginx Server
      apt:
        name: nginx
        state: present
        update_cache: yes
    - name: Start and Enable Nginx
      service:
        name: nginx
        state: started
        enabled: yes
  • apt 모듈을 이용해 패키지를 설치하고, service 모듈로 서비스 실행/부팅 시 자동실행 설정을 합니다.

7. Ansible Galaxy

  • Ansible Galaxy는 다양한 역할(Roles)을 미리 만들어 공유하는 저장소입니다.
  • 필요한 서비스를 Ansible Galaxy에서 찾으면, 설치 후 재사용이 가능합니다.

예: Elasticsearch를 설치하기 위한 elastic.elasticsearch Role

ansible-galaxy install elastic.elasticsearch,v7.17.0

 

이 후 Playbook에서 해당 롤을 사용할 수 있습니다.


8. Elasticsearch 설치 예시

8.1 사전 준비: Java 설치

ElasticSearch는 Java가 필요합니다. 먼저 모든 노드에 Java를 설치하는 Playbook 예시 java.yml:

- hosts: all
  become: yes
  tasks:
    - name: Install JDK 11
      apt:
        update_cache: yes
        name: openjdk-11-jdk
        state: present

 

실행:

ansible-playbook -i inventory.yml java.yml -u test --ask-become-pass

8.2 Elasticsearch Playbook 작성

playbook.yml 예시:

- hosts: master
  roles:
    - role: elastic.elasticsearch
  vars:
    es_heap_size: "1g"
    es_config:
      cluster.name: "test-cluster"
      cluster.initial_master_nodes: "10.10.10.211"
      discovery.seed_hosts: ["es1:9300", "es2:9300", "es3:9300"]
      http.host: 0.0.0.0
      http.port: 9200
      node.data: false
      node.master: true
      transport.host: 0.0.0.0
      transport.port: 9300
      bootstrap.memory_lock: false

- hosts: data01
  roles:
    - role: elastic.elasticsearch
  vars:
    es_data_dirs:
      - "/opt/elasticsearch"
    es_config:
      cluster.name: "test-cluster"
      cluster.initial_master_nodes: "10.10.10.211"
      discovery.seed_hosts: ["es1:9300", "es2:9300", "es3:9300"]
      http.host: 0.0.0.0
      http.port: 9200
      node.data: true
      node.master: false
      transport.host: 0.0.0.0
      transport.port: 9300
      bootstrap.memory_lock: false

- hosts: data02
  roles:
    - role: elastic.elasticsearch
  vars:
    es_config:
      cluster.name: "test-cluster"
      cluster.initial_master_nodes: "10.10.10.211"
      discovery.seed_hosts: ["es1:9300", "es2:9300", "es3:9300"]
      http.host: 0.0.0.0
      http.port: 9200
      node.data: true
      node.master: false
      transport.host: 0.0.0.0
      transport.port: 9300
      bootstrap.memory_lock: false

주의

  • cluster.initial_master_nodes는 실제 마스터 노드 IP나 호스트명을 적어야 합니다.
  • discovery.seed_hosts 역시 실제 호스트명 혹은 IP:포트로 적절히 수정해야 합니다.

8.3 /etc/hosts 편집(호스트명 -> IP 매핑)

서버 간 도메인 이름(호스트명)으로 통신 가능하도록 /etc/hosts를 편집할 수 있습니다.

 

이걸 매니지 노드 3대에 설정 해주어야 합니다.

vi /etc/hosts

아래 내용 추가 

10.10.10.211 es1
10.10.10.212 es2
10.10.10.213 es3

이제 es1, es2, es3로 통신할 수 있으므로, Playbook에 discovery.seed_hosts: ["es1:9300", "es2:9300", "es3:9300"] 를 사용 가능합니다.

8.4 플레이북 실행

ansible-playbook -i inventory.yml playbook.yml -u test --ask-become-pass
 
  • Java 설치가 제대로 끝났는지, OS 버전과 ElasticSearch 호환성 등을 먼저 확인해야 합니다.
  • 오류 발생 시 주석 처리 혹은 해당 역할(버전 호환성) 설정을 재검토합니다.

9. 자주 겪는 문제와 해결

  1. SSH 비밀번호를 계속 물어봄
    • SSH 키 생성 및 ssh-copy-id가 제대로 완료되었는지 확인합니다.
    • Inventory 파일에서 사용자 이름이 맞는지 확인합니다.
  2. Ubuntu/Debian 버전 호환성 문제
    • Elasticsearch Role이 특정 OS 버전과 호환되지 않을 수 있습니다.
    • meta/main.yml 혹은 Role 문서를 확인해 현재 OS에서 지원되는지 확인합니다.
  3. 호스트명을 찾을 수 없음
    • /etc/hosts에 설정이 누락되었거나, DNS가 제대로 설정되지 않은 경우입니다.
    • IP 주소를 직접 사용하거나 /etc/hosts를 수정합니다.

10. 정리

  • Ansible은 SSH 키 기반 인증으로 원격 서버에 명령을 자동화합니다.
  • InventoryPlaybook을 구성해 멱등성 있는 작업을 쉽게 배포할 수 있습니다.
  • Ansible Galaxy를 사용하면 자주 쓰이는 서비스(예: Elasticsearch, Nginx, MySQL, etc.)에 대한 Role을 재활용할 수 있어 생산성을 높일 수 있습니다.
  • 작업 실행 시에는 -i 옵션으로 Inventory, -u 옵션으로 사용자명, --ask-become-pass로 sudo 비밀번호 입력을 받아 root 권한으로 작업을 진행할 수 있습니다.
  • 오류가 발생하면 원인 파악(OS 버전, 패키지 버전, network 설정, 호스트명 등)을 통해 플레이북을 수정 또는 조건을 조정하면 됩니다.

위 과정을 바탕으로 Ansible을 이용한 자동화 및 IaC 구성을 체계적으로 적용해보시기 바랍니다. 필요에 따라 Role, Task, Handler 등을 잘 분리하면 유지보수와 확장에 큰 도움이 됩니다.

'Cloud' 카테고리의 다른 글

[Docker-compose]  (0) 2025.03.10
[Docker] Docker 란?  (0) 2025.03.10
Amazon S3  (0) 2025.02.16
aws ec2 Ubuntu의 systemd에 Java application을 Service로 등록  (0) 2023.08.02