앤서블(Ansible) 사용해보기

Donghyun Kim·2023년 2월 23일
0
post-thumbnail

앤서블

앤서블 이란?

앤서블(Ansible)은 리눅스와 유닉스 기반 시스템의 설정 및 배포 작업을 자동화하기 위한 IT 자동화 도구 중 하나입니다. 앤서블은 에이전트(agent)가 필요하지 않으며, SSH를 통해 리모트 노드에 명령을 전달하고, YAML 형식으로 작성된 Playbook을 사용하여 간단하게 배포 작업을 수행할 수 있습니다. 앤서블은 간단하고 쉽게 배울 수 있기 때문에, DevOps 엔지니어 및 시스템 관리자들에게 매우 인기 있는 도구 중 하나입니다.

기본 아키텍처

앤서블의 구성

1.본체

앤서블 소프트웨어 그 자체로, 서버/클라이언트 구성과 같은 형태가 아니며 상주 프로세스를 둘 필요가 없다. 한 번 설치하면 필요할 때 명령을 실행하는 것으로 충분하다.

2.인벤터리(Inventory)

앤서블이 작업할 대상 머신. "어디에서" 앤서블을 실행하는가?

인벤터리는 앤서블에서 조작 대상이 되는 서버 접속 정보를 나타낸다. 인벤터리는 여러 개의 서버를 그룹화해 정의하거나 각각의 서버와 그룹에 대해 변수를 사용한 파라미터를 설정할 수 있다.

3.모듈(Module)

앤서블에서 실행되는 개별 작업의 정의. "무엇을" 앤서블에서 실행하는가?

앤서블에서 실행된 하나하나의 명령 같은 것. ansible-doc -l 명령어로 공식 모듈을 확인할 수 있다.

4.플레이북(Playbook)

모듈 호출의 중심에 있는 앤서블 코드. "어떻게" 앤서블을 실행하는가?

앤서블에서 스크립트(=코드)이며 앤서블을 사용할 때 필요한 작업은 플레이북의 구현과 실행이라고 할 수 있다. YAML로 작성한다.

앤서블 분기 처리

  • ansible은 멱등성이 보장되므로 이미 설치되어 있을 경우 같은 결과 값을 유지한채 다음 task가 실행됩니다.
  • 혹은 ansible 조건문으로 특정 Task가 완료되거나 완료되지 않을 경우 또는 결과 값을 통해서 task 실행 여부를 정할 수 있습니다.
  • Playbook에서 tags 모듈을 통해 playbook 실행 시 특정 작업 또는 그룹만 실행하거나 제외하도록 지정할 수 있습니다.

앤서블 설정 파일

INI 형식의 설정 파일

(위에 있을 수록 우선순위 높음)

  • ANSIBLE_CONFIG 환경 변수에 지정한 파일
  • 현재 디렉토리에 있는 ansible.cfg 파일
  • 사용자 홈 디렉토리에 .ansible.cfg 파일
  • /etc/ansible/ansible.cfg 파일(글로벌한 기본 설정)

앤서블 명령어

커맨드 종류

ansible 명령어 옵션

ansible로 시작하는 명령어

-m : 모듈 선택
-a : 모듈 파라미터
-i : 인벤토리 선택
-u : 유저명

앤서블 설치

설치 환경 및 서버 구성

Controller Node

  • 34.64.82.213
  • ubuntu 18.0 LTS

Managed Node

  • 34.64.68.248
  • ubuntu 18.0 LTS

설치

앤서블을 사용할 메인 컨트롤러 노드 서버에 앤서블을 설치해야 합니다
테스트 용으로 GCP에 Ubuntu로 VM을 생성하여 진행하였습니다.

sudo apt update
sudo apt install -y ansible
# 설치 완료 후 버전 확인
ansible --version

SSH 키 설정

Ansible은 SSH 접속을 기반으로 원격 서버들에게 명령을 전달합니다.
따라서 Controller 서버와 원격 서버간 SSH key가 공유되어야 합니다.
Controller 서버에서 모든 작업을 완료할 수 있습니다.

# ssh 키 생성
# GCP Intsance는 메타데이터에 별도 ssh key를 등록해주어야 함
ssh-keygen -t rsa -C [원격서버계정]

# 원격 서버에 ssh 키 복사
ssh-copy-id [원격서버계정]@[원격서버IP]

# Test
ssh [원격서버계정ID]@[원격서버IP]

ssh-copy-id 명령 실행 시 Permission denied가 발생하면 해당 원격 서버의 sshd 공개키 인증이 허용되지 않는 경우입니다.
따라서, 해당 원격 서버에 접속하여 /etc/ssh/sshd_config 파일을 열고
#PubkeyAuthentication yes 부분의 주석을 해제한 후
다음 명령으로 sshd 서비스를 재실행 해야합니다.

$ sudo systemctl restart sshd

앤서블 설정 및 테스트

인벤토리 설정

설정 파일 경로
/etc/ansible/hosts

sudo vi /etc/ansible/hosts

  1. hosts 파일 내부에 원격 서버 IP 등록
34.64.68.248
  1. 인벤토리 내부에서 python 모듈 경로를 찾기위한 변수 값 할당
[all:vars]
ansible_python_interpreter=/usr/bin/python3
  1. 인벤토리에 등록된 서버에 접속이 되는지 Ping Test
ansible all -m ping


원격서버 배포 테스트

ansible all -m copy -a "src=./test.txt dest=~/test.txt"

ansible 명령어를 통해 컨트롤러 노드에서 test.txt 파일을 생성하고 인벤토리에 연결된 원격 서버에 copy

원격 서버(Managed Node)에 test.txt 파일이 생성된 모습


profile
"Hello World"

1개의 댓글

comment-user-thumbnail
2023년 5월 10일

캬 잘 보고갑니다!

답글 달기