쿼카러버의 기술 블로그

[Ansible] Ansible 시리즈 1탄 - Ansible 기본 개념 및 설치 튜토리얼 본문

[Infra & Server]/데브옵스

[Ansible] Ansible 시리즈 1탄 - Ansible 기본 개념 및 설치 튜토리얼

quokkalover 2022. 8. 10. 18:21

Ansible 시리즈 1탄을 작성한다. 본 시리즈의 목적은 다음과 같다

 

(1) Ansible 기본 개념 및 설치 진행

(2) Ansible를 활용해 여러 노드들에 동시에 명령어 실행 (패키지 설치 등)

(3) Ansible를 활용한 부하테스트 진행 (locust)

 

사실 시리즈 2탄 까지만 봐도 Ansible를 활용도가 충분하다. 예를 들어 여러 대의 노드에 카프카를 설치한다든지 할 때 각 서버에 ssh로 접근해서 동일한 커맨드를 계속 반복하는 것보다는 Ansible를 활용하면 한번에 여러 노드에 설치할 수 있고, 이후에도 동일한 세팅을 설정할 수 있기 때문이다.

 

하지만 필자는 이번에 10대의 노드를 활용해 부하테스트를 진행해보았고, Ansible를 활용하면 간단하게 부하테스트도 세팅할 수 있기 때문에, Ansible를 이것 저것 조작해보면서 추후에 다시 재활용해보기 위해 글을 작성한다.

 

자 이제 Ansible의 기본개념이 무엇인지 한번 알아보자.

 

Ansible이란?

Ansible은 IaC(Infrastructure as Code)개념의 자동화 툴이다. 오픈 소스로, 컴퓨터의 인프라 구성, 프로비저닝, 구성 관리, 어플리케이션 배포 등 수동 IT 프로세스를 자동화 할 수 있다. 클라우드 환경, 관리해야 하는 서버가 증가하는 환경에서는 서버에 동일한 환경을 배포해야하고, 이를 모두 쉘 스크립트 하나로 실행하기에는 매우 번거롭다. 이에 따라 Ansible은 YAML을 사용하는 단순하면서도 사용하기 용이한 자동화 툴을 제공하고 있다.

Ansible의 가장 큰 특징은 Agentless다. 무슨 말이냐면 다른 자동화 도구들은 타겟 서버들에 모두 agent를 설치하여 pull을 하는 구조로 동작하지만, Ansible은 remote server에 agent를 설치하지 않아도 되는 push방식으로 동작한다.

Ansible 구조

Ansible을 사용하기 위해서는 기본적으로 모든 서버에 python v2.4이상 및 ssh가 설치돼있어야 한다.

Control node (컨트롤 노드)

Ansible을 설치하고 실행하는 노드를 의미한다. ansible, ansible-playbook, ansible-inventory등과 같은 command를 통해 원격으로 관리해야 하는 노드들을 제어한다.

Managed node (관리 노드)

Control node에서 커맨드를 통해 관리되는 서버를 의미한다. 위에서 말했듯 agentless기 때문에 Managed node에는 Ansible을 설치할 필요가 없다.

Inventory (인벤토리)

Managed node의 리스트 파일을 의미한다. control node에 위치한 파일로, 호스트 파일 처럼 Managed node에 대한 IP주소, 호스트 정보 등과 같은 정보를 기술하고 있다. Control node에서는 inventory를 활용해서 managed node를 관리한다.

그 외에도 role, playbook, task, module등과 같은 개념도 알아볼 필요가 있는데, 이 개념들은 추후에 다루기로하고, 일단은 바로 Ansible을 어떻게 활용할 수 있는지 예시를 통해 알아보자.

control node AWS 세팅


동일 security group 에다가 인스턴스 4개 만듬, 이렇게 하면 private IP로 접근할 수 있음.

 

(q님 댓글을 보고 작성한 수정 및 추가 내용)

 

참고로 위 표현은 "AWS에서 각 인스턴스가 동일한 서브넷을 공유하고, 보안 그룹에 해당 서브넷 범위의 private IP를 등록한 후 같은 보안 그룹을 공유하도록 설정하면 사설 IP로 접근이 가능하다"가 더 구체적이고 맞는 표현이다.

 

보안그룹은 인바운드 트래픽과 아웃바운드 트래픽에 대한 규칙을 정의하는 역할을 하지, 인스턴스 간의 사설 IP를 통한 접근을 가능하게 하는건 아니기 때문. 따라서 인스턴스들이 동일한 서브넷과 VPC를 공유하도록 설정하는 것이 중요하다. 이를 통해 인스턴스들은 동일한 네트워크 상에서 서로의 사설 IP를 인식하게 되고, 이렇게 인식된 IP들 간의 통신을 가능하게 하려면 보안 그룹에 사설 IP가 속한 서브넷 범위를 허용 설정해야 한다.

 

두 개의 AWS EC2 인스턴스, 인스턴스 A와 인스턴스 B가 있고, 둘 다 같은 VPC(가상 프라이빗 클라우드) 내에 있지만, 서로 다른 서브넷에 위치한다고 가정해보자. 서브넷 1과 서브넷 2. 각 인스턴스에는 해당 서브넷의 IP 범위에서 할당된 사설 IP 주소가 배정된다.

  • 인스턴스 A: 사설 IP - 10.0.1.10 (서브넷 1 범위: 10.0.1.0/24)
  • 인스턴스 B: 사설 IP - 10.0.2.10 (서브넷 2 범위: 10.0.2.0/24)

인스턴스 A가 인스턴스 B와 사설 IP를 사용하여 통신하려면, 이 인스턴스들에 연결된 보안 그룹에 다른 인스턴스의 서브넷에서 오는 트래픽을 허용하는 규칙이 설정되어 있어야 한다.

  • 인스턴스 A의 보안 그룹에는 인스턴스 B가 위치한 서브넷 2의 범위인 10.0.2.0/24에서 오는 트래픽을 허용하는 인바운드 규칙을 추가해야 한다.
  • 인스턴스 B의 보안 그룹에는 인스턴스 A가 위치한 서브넷 1의 범위인 10.0.1.0/24에서 오는 트래픽을 허용하는 인바운드 규칙을 추가해야 한다

근데 위 예시는 개념 설명을 위해 다른 서브넷에 위치시킨거고, 나같은 경우는 동일 서브넷을 공유하게 하고, 하나의 보안그룹에 해당 서브넷에서 오는 트래픽을 허용하도록 했다. 


step 1) ssh setting

create user

sudo -u root
adduser [username]
usermod -aG sudo [username]
  • 나는 그냥 username을 ubuntu로 진행했음. aws를 사용하면 그냥 ubuntu쓰면 됨

여기서 생성한 ssh key를 연결하고자 하는 remote 서버들에도 옮겨주면 좋음

먼저 로그인하기 위해서 AWS에서는 pem이 필요하니까 아래처럼 옮기기

# scp -i richet-test.pem richet-test.pem ubuntu@51.180.117.231:~
scp -i {pem} {pem} {user-name}@{ip}:{remote server's directory}

ansible-host에 pem키 등록

#복사하고나서
chmod 600 kas-dev.pem
sudo ssh-agent bash
ssh-add kas-dev.pem

위와 같이 등록 해두고

ssh ubuntu@{ip주소}

위 명령어만 입력해도 pem키없이 접속할 수 있음

참고로 서버에 로그아웃 한 뒤에 재접속을 하면 설정이 초기화가 되는 문제가 있다. 따라서 위에 커맨드를 재실행해주어야함. 만약 이게 너무 귀찮다면 그냥 이 서버에서 key만들어서 remote 서버들에 등록해두고 사용할 수 있게 하면 된다. 하지만 본 글에서는 빠르게 작업하기 위해 pem키를 옮겨서 진행할 예정이다. 직접 ssh키를 만들어서도 할 수 있는데, 관련해서는 아래 글을 읽어보는 것을 추천한다.

ansible 설치

ubuntu에서는 아래커맨드로 설치해야 함


#ubuntu에서는
sudo apt update
sudo apt install ansible

다른 OS에서는 아래로도 충분한 경우도 있음

#아래와 같이 curl을 이용해 다운받고,

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

#아래 명령을 실행해 설치 할 수 있다.

python get-pip.py

자 이제 ansible를 활용해 다른 서버에 명령어를 실행할 준비를 마쳤다. 이제 한번 확인해보자.

기본 연결 (ping 까지만)

host 등록 (inventory생성)

  • IP address 나 FQDN을 /etc/ansible/hosts 디렉토리에 입력
  • [{group_name}]로 그룹 구분
vim /etc/ansible/hosts

#아래 내용 입력
[locustworkers]
172.31.22.116
172.31.24.46
172.31.27.106
  • 권한 문제(permission error) 때문에 파일 생성 안되면 아래처럼 파일 만들고 sudo vim 사용해서 수정
  • sudo bash -c 'cat >> /etc/ansible/hosts'

Inventory 확인

ansible all --list-hosts

node들에 ping날리기

ansible all -m ping

아래와 같이 성공했다고 나와주어야 함

172.31.31.233 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
172.31.23.205 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
172.31.29.10 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

 

자 여기까지 Ansible를 설치해서 여러 노드에 연결하는데 까지 해보았다. 이제 Ansible를 활용해서 여러 서버에 동시에 여러 명령어를 실행해 패키지들을 설치해보자

 

Comments