티스토리 뷰

Ansible 에 대해 공부하는 중 시스템을 관리하고 배포한다는 점에서 docker 와 되게 비슷하다고 생각하였습니다.

 

그 둘의 차이를 조사한 결과 

쉽게 말해서, Ansible서버 구성 및 자동화 도구이고 docker가상머신 플랫폼 및 컨터이너 기반 이라는 것을 알았습니다.

 

만약 서버가 50대 있고 nginx를 설치한다던가 시스템 계정을 만든다던가 그러면 일일이 50대를 다 들어가서 설정해줘야하는 불편함이 있을 것입니다. 하지만 그런 불편함을 Ansible 이 대신 한번에 다 해줍니다!!


위에서 말한 것들을 확인해보기 위해 실제로 Ansible 실험환경을 구축하여 nginx를 배포해보는 작업을 해보겠습니다. (참고)

 

우선, docker 로 대상 컨테이너(worker) 2개서버 컨테이너(ansible-server) 1개를 띄우고 제어 노드를 이용하여 관리노드에 nginx 를 설치해보겠습니다.


1. Worker Container 만들고 SSH 설치하기

ubuntu os 가 설치된 Worker Container를 만듭니다.

# 컨테이너 1
$docker run -it -d --name vm1 -p 8080:80 ubuntu
# 컨테이너 2
$docker run -it -d --name vm2 -p 8081:80 ubuntu

현재 상태

1.1 컨테이너 접속하고 SSH 설치

Ansible을 사용할 것이니 ssh를 설치하고 실행시킬 것입니다.

우선 2개의 워커 컨테이너가 있으니 하나씩 따라해주시면 되겠습니다.

 

#1
$docker exec -it vm1 /bin/bash
#2
$docker exec -it vm2 /bin/bash

In docker worker 컨테이너...

$apt-get update
$apt-get install -y openssh-server
$apt-get install -y vim

 

1.2 설정 후 SSH 실행

SSH 설치가 정상적으로 되었다면 외부와 접속을 위해서 root의 계정 비밀번호와 SSH 설정을 변경해야 합니다.

(필자는 이 부분을 설정해주지 않아 ssh접속이 안되는 불상사(?)로 인해 시간을 버렸기 때문에 꼭 설정하시길 바랍니다)

$passwd
$vim /etc/ssh/sshd_config

sshd_config

비밀번호와 SSH 설정을 끝내고 SSH 서비스를 실행시켜줍니다.

$service ssh status
$service ssh restart

 여기까지 다른 워커 컨테이너도 해주시면 되겠습니다.

 


2. Ansible Server 구축

2.1 docker 서버 컨테이너 만들기

# In Server
$docker run -it -d --name ansible-server ubuntu
# 접속
$docker exec -it ansible-server /bin/bash

$apt-get update
$apt-get install -y vim

# ansible 설치
$apt-get install ansible
$ansible --version

Ansible 버전 확인

2.2 Worker 컨테이너 IP 구하기

Ansible이 관리하기 위해서 Work 컨테이너 ip 주소를 inventory에 넣어둬야 합니다.

 

먼저 worker 컨테이너 ip를 알아야 합니다.

$docker inspect vm1
$docker inspect vm2

worker ip 주소

위와 같은 명령어로 확인할 수 있지만 좀 세련되게 IP 를 찾을 수 있는 방법을 소개하겠습니다.

$ docker inspect -f "{{ .NetworkSettings.IPAddress }}" CONTAINER_ID

예시

 

각각 컨테이너의 IP를 각각 구합니다.

 

2.3 playbook 폴더를 만들고 인벤토리와 구성파일을 만든다.

# In server...
$mkdir playbooks

$vim inventory

#[webserver] 
# 172.17.0.2
# 172.17.0.3

$vim ansible.cfg
#[defaults] 
#inventory = ./inventory 
#remote_user = root
#ask_pass = false 

#[privilege_escalation] 
#become = true 
#become_method = sudo 
#become_user = root 
#become_ask_pass = false

 

[webserver]라는 그룹을 만들고 두 컨테이너의 ip주소를 입력하고 구성파일에 인벤토리파일을 읽을 수 있게 설정해줍니다.


참고

Ansible 의 구성파일의 우선순위

1. Ansible_config 환경변수로 지정한 파일
2.현재 디렉터리의 ansible.cfg (추천)
3. 홈 디렉터리의 ~/.ansible.cfg
4. /etc/ansible/ansible.cfg

 

2.4. playbook 작성 (어떤 명령을 보낼지 정의)

$vim playbook-test.yaml

---
- hosts: webserver

  tasks:
  - name: Install nginx latest version
    apt:
     name: nginx
     state: latest

nginx를 최신 버전으로 설치하는 yaml파일입니다.

 

2.5 SSH Key 만들기

서버가 SSH를 통하여 worker 들에게 해당 playbook을 전달해 worker 들이 수행합니다

이때, Key를 사용하여 SSH에 접속할 수 있도록 worker에 서버의 공개키를 옮겨주어야 합니다.

 

# server container 내부
$ssh-keygen
$ssh-copy-id .ssh/id_rsa_pub [worker's Ip addr]

worker 의 계정 패스워드가 지정되어 있어야 key가 옮겨집니다.

이미 옮긴 상태

 

2.6  worker의 nginx 설치 여부 확인과 ping Test 

Ansible을 통해 각 worker에 nginx 배포를 하는 것이 목적입니다 

 

  • nginx 가 설치되어 있지 않은 것을 확인합니다.
  • Ping Test

Ping 정상

만약 ping이 되지 않는다면 worker 계정의 패스워드 설정 또는 worker ssh 서비스 상태를 확인해주시면 됩니다.

 


3. 배포

# In server...
# 실행은 하지않고 문법 체크
$ ansible-playbook playbook-test --syntax-check

# 실행
$ ansible-playbook playbook-test.yaml

성공


4. nginx 서비스 활성화

# In worker...
$ service nginx start

 

끝으로, nginx 서비스 확인 해줍니다. ( 포트는 각각 8080, 8081)

 


이것으로  docker로 Ansible 실험 환경을 만들어봤습니다.🎉

 

처음해보는 거라 시간이 꽤 소요되었고 playbook 문법과 yaml 을 다루는 데 공부를 더 해봐야겠습니다.

 

추가적으로, AWS에서 Ansible 을 사용할 수 있다는데 조만간 해볼 예정입니다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함