본문 바로가기

DevOps/Ansible

[Ansible #1] 앤서블 튜토리얼

728x90

안녕하세요 오랜만입니다.

 

DevOps 엔지니어에 관한 툴을 찾다가 우연히 로드맵을 보게되었다. 

 

출처 : https://velog.io/@exploit017/2020-%EB%8D%B0%EB%B8%8C%EC%98%B5%EC%8A%A4-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%A1%9C%EB%93%9C%EB%A7%B5

 

2020 데브옵스 개발자 로드맵

https://github.com/devJang/developer-roadmap/blob/master/pdf/devops.pdf

velog.io

 

데브옵스 로드맵 한글버전

 

쭈욱보다가 IaC 중 자주 언급되던 Ansible과 Terraform이 눈에 들어왔고 이번기회에 공부해보기로했다.

 

 

 

우선 Ansible이란 여러 개의 서버를 쉽게 관리하기 위한 툴이다. 

n개의 서버를 1개의 관리서버에서 동시에 어떤 행위를 하거나 모니터링을 하거나 하는 등의 기능을 수행할 수 있다.

 

그래서 인프런이나 여러가지 블로그들에 있는 예제들을 보면 처음 환경 구성을 할때 VM을 써서 같은 네트워크 상에 여러개의 가상 컴퓨터를 만들어 놓고 실험을 했는데 나는 VM을 설치하기 귀찮아서 왠지 Docker도 내부 네트워크를 공유하니까 우분투 컨테이너를 띄워놓고 실험하면 되지않을까? 해서 실험해보니 되서 이걸로 테스트 하기로했다.

 

실무에서는 어떻게 사용하는지 모르겠지만 일단 나처럼 컨테이너 상에 하는 경우는 드물거 같다는 생각을 했다. 왜냐하면 컨테이너는 그냥 하나의 이미지만 제대로 만들어놓고 그거를 복사해서 여러개 띄우면 되는건데 굳이 이걸 여러개 켜놓고 앤서블로 환경구성을 한다? 조금 비효율적인거같다. 물론 이미 띄워져있는 컨테이너에 추가적인 환경구성의 경우에는 얘기가 다르겠지만 비효율적인 것은 틀림없다.

 

앤서블에 대략적인 기능은 알았고 보다보니 테라폼에 대해서도 궁금해졌는데

대략적으로 보니 이건 서버 자체를 구성하는 거였다. 예를들면 AWS에 EC2를 T2마이크로 이미지로 n개를 띄운다거나 하는...

 

만약 devops에 대한 파이프라인이 제대로 갖춰져있다면 내 생각에는

 

테라폼으로 서버에 대한 구성을 하고 앤서블을 통해 서버에 통합적으로 기본 환경구성을 하고 특정 서버에는 어떤 도커를 띄운다거나 하는 방식으로 이루어질거 같다. 

 

 

일반적인 ansible 환경구성

 

어쨌거나 예제들을 보면 대략적으로 이런식으로 환경구성을 해놨는데 

 

컨테이너로 구성한 내환경

나는 좀 변형에서 이렇게 구성했다.

 

 

 

 

나 같은 경우 일단 ubuntu 이미지를 세 개 만들어서 실행했다.

 

 

노드 123으로 생성

 

 

이때 컨테이너를 띄울 때 명령어는 밑과 같다.

docker run -it -d --name node1 /bin/bash    

이렇게 띄워진 이미지에 여러가지를 설치해줘야하는데

 

1. python

2. ssh, sshd

여기에 추가적으로 vi나 nano의 편집기 정도를 설치해 주면 좋다.

 

컨테이너 안으로 접속하여 python과 ssh를 설치해주고 가장 중요한 host에서는 python과 ansible을 설치해줘야한다.

 

ansible설치 방법에는 여러가지가 있었지만 나는 python pip를 이용하기로했다. (ansible은 python기반이라 pip로 설치가 가능하다.)

 

host컴퓨터에 ansible설치를 완료하고 각각의 노드를 등록해야하는데 이 노드를 정리해둔 것을 '인벤토리'라고 한다.

 

따로 파일로 만들어도 되지만 defualt로 /etc/ansible/hosts 파일을 수정해서 사용해도된다.

 

 

도커의 ip를 확인하는 법은 docker inspect 명령어를 사용하시면 확인할 수 있습니다.

 

이제 

ansible all -m ping -k 명령어를 날리면 

 

172.17.0.4 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 172.17.0.4 port 22: Connection refused",
    "unreachable": true
}

다음과 같은 에러를 볼수가 있는데

 

이 에러는 ssh가 설치 안되있어서 그렇고 

각각의 노드에 접속하여 편집기로 내용을 수정해줘야합니다.

 

vi /etc/hosts.allow

sshd : 172.17.0.1 

 

을 입력해줍니다. 172.17.0.1 은 host ip입니다.

 

그리고 ssh 서비스를 restart해줍니다.

service ssh restart

 

그리고 각각의 노드에 사용자 및 비밀번호도 설정해줍니다.

저는 비밀번호 쉽게 1234로 정했습니다.

사용자 명은 위에 /etc/ansible/hosts 에서 정했던걸로 변경해줍니다.

 

근데 처음에 공개키가 교환이 안되서 오류가 나는 경우가 있습니다. 

 

이때는 

 

ansible all -m ping

을 먼저해주고 

 

ansible all -m ping -k

를 해주면됩니다.

 

근데 정말 속상하게 이렇게 경고창이뜨는데 처음엔 안그랬는데 왜 갑자기 뜨는지 모르겠다... 조만간 해결해보는걸로..

 

 

 

이런식으로 연결이 완료되면 

 

다양하게 실험을 해볼수 있다.

 

나도 아직 공부를 덜해서 기본적인명령어도 잘 모르지만 playbook을 통해 명령을 줄 수있다. 이건 나중에 해보고

 

ansible all -m shell -a "mkdir ansible_Test" -k

명령어를 해주면 모든 node에 쉘명령어가 적용되어 디렉토리가 만들어지는걸 확인할 수 있다.

 

 

다음엔 플레이북을 활용에 대해 포스팅해보겠다.

반응형