Ansible Server 생성

Violet_Evgadn·2023년 4월 25일
0

CI&CD 자동화

목록 보기
15/28
post-thumbnail

VM으로 Ansible 만들기

필자는 Docker Image를 활용해 Ansible-Server를 생성할 것이다.

하지만 이전에 SSH Server를 VM을 통해 만들 수 있었듯 Ansible Server도 VM 환경에서 생성할 수 있다.

간단히 Ansible Server 생성 방법에 대해 알아보고 넘어가자

Ansible 설치

yum install ansible

Ansible Server 생성이 완료되었다!

너무 간단해서 허탈할지 모르겠으나 이는 Linux 상에서 Ansible Server를 만들었을 때 유효하다는 것을 알아두자.

이전 Section에서 말했듯 Ansible은 Python을 통해 Server와 Node 사이 통신이 수행되기 때문에 만약 Windows를 Ansible Server로 만들고 싶다면 Python도 설치되어 있어야 한다.

Ansible 설치 확인

ansible --version

Ansible Server의 중요 파일 설명

  • /etc/ansible/ansible.cfg
    • Ansible Server의 환경 설정 파일
  • /etc/ansible/hosts
    • Ansible에 접속하는 Host(Ansible Node) 목록
    • Ansible Node들의 IP Address를 이 파일에 입력하면 Ansible이 기록된 IP Address를 가진 Node들에게 Script를 보낼 수 있다.

Docker Image를 활용해 Ansible Server 생성

1. Docker Image 다운로드하기

docker pull edowon0623/ansible

2. DooD 방식으로 Docker Container 생성

docker run -itd --name ansible-server -p 20022:22 -e container=docker \
	--tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro  \
	-v /var/run/docker.sock:/var/run/docker.sock edowon0623/ansible:latest /usr/sbin/init

참고로 원래라면 SSH Server로 설치했던 docker-server도 존재해야 한다.

필자는 보기 좋게 하기 위하여 잠시 컨테이너를 삭제시켰다.

이 단계에서 일단 Ansible-Server의 설치는 완료되었다.

3. Ansible Server의 접속

ssh root@localhost -p 20022

이전 SSH Server에 접속하는 방법과 동일하게 접속하면 된다.

2번에서 우리는 20022 Port와 연결시켰기 때문에 20022 Port를 통해 접속하면 된다.

이전에 말했듯 DooD 방식이므로 Docker는 이미 동작중인 상황이라고 보면 된다.

4. Ansible 설치 여부 확인

ansible --version

위 사진처럼 Version에 대한 설명이 나온다면 설치가 되어 있는 상태인 것이다.

5. Ansible Node 지정하기

위에서 말했듯 /etc/ansible/hosts 파일에 Ansible Server와 연결될 Ansible Node들의 IP Address를 입력해줘야 한다.

그렇다면 먼저 Ansible Node들의 IP Address를 알아야 한다.

물론 각각의 Server에 SSH 접속을 한 이후 "hostname -i" 명령어를 통해 직접 IP Address를 알아볼 수도 있다.

하지만 우리는 SSH Server 및 Ansible Server를 모두 Docker Container 형식으로 만들었기 때문에 더욱 편리한 방법이 있다.

Docker Container들은 별다른 네트워크 설정을 하지 않을 경우 "Bridge"라는 Network Driver에 연결되어 있다.

우리는 Container 생성 시 네트워크 설정을 하지 않았으므로 Ansible Server 및 Docker Server는 Bridge에 연결되어 있을 것이며 Bridge에 연결된 Container List를 얻어온다면 편하게 Container들의 IP Address를 알아낼 수 있을 것이다.

Bridge에 연결된 Container List를 얻어오는 명령어는 아래와 같다.

docker network inspect bridge

참고로 우리는 DooD 방식을 활용했기 때문에 Ansible-Server에서 명령을 실행하든 Docker-Server에서 명령을 실행하든 Host(실행 환경;Windows)에서 명령어를 실행하든 동일한 결과가 나올 것이다.

우리는 Ansible Node로 ansible-server와 docker-server를 지정해보겠다.

위에서 볼 수 있듯 ansible-server는 172.17.0.3, docker-serveer는 172.17.0.4 IP Address를 가지고 있다.

우리는 이 IP Adreess들을 /etc/ansible/hosts에 입력해주면 된다.(당연히 Ansible-Server에서 실행되어야 한다)

mkdir /etc/ansible;vi /etc/ansible/hosts

이제 Ansible Server 설정이 완료되었다.

참고로 [devops]는 172.17.0.3과 172.0.4를 1개 그룹으로 묶는 이름으로 굳이 devops가 아닌 그룹을 구분 할 수 있게 하는 이름으로 지정하면 된다.


문제 해결법

REMOTE HOST IDENTIFICATION HAS CHANGED! 에러

이번 Section 이전 실습에서도 많이 발생했었던 에러이다.

이 에러는 "Add corret host key in ~" 문구에서 볼 수 있듯 접속을 위한 Key값이 일치하지 않는다는 것이다.

Client Node에서 SSH를 통해 Server Node로 접속할 경우 Server Node의 공개키를 Client Node의 "~/.ssh/known_hosts" 파일에 저장한다.

Client Node 측에 공개키가 저장되어 있지 않다면 Server Node에 대한 검증을 수행한 뒤 검증이 완료된 경우 known_hosts 파일에 공개키를 저장하고 접속한다. 만약 공개키가 저장되어 있다면 별도의 Server Node에 대한 검증 없이 바로 접속이 가능해지는 것이다.

문제는 이 Client Node에 저장된 공개키가 자동으로 변경되지 않는다는 것이다.

만약 우리가 Container를 삭제하고 재생성시켰다고 가정하자. 이 경우 새로 생성된 Container와 이전에 삭제했던 Container의 ssh 접속 경로는 동일하게 root@localhost -p 20022가 될 것이다.

그런데 known_hosts에 저장된 root@localhost -p 20022 Node에 해당하는 공개키는 이전에 삭제했던 Container에 대한 공개 키인 것이다.

즉, 원래라면 root@localhost -p 20022는 새로 생성된 Container(Server Node)이기 때문에 known_hosts 파일에 새로운 공개키를 저장하고 접속이 수행되어야 한다. 하지만 Client Node에 존재하는 known_hosts 파일은 root@localhosts -p 20022라는 "이전에 삭제했던 Node" 공개키를 저장하고 있는 것이다.

이는 Container가 삭제되었다 하더라도 known_hosts의 삭제된 Container와 연동된 공개키에 대해선 변경사항이 적용되지 않기 때문에 발생하는 문제인 것이다.

이 때문에 root@localhost -p 20022로 접속할 경우 공개키가 이미 known_hosts에 존재한다고 판단하여 저장된 공개키와 실제 Container의 Key를 비교해볼 것이며, 당연히 다른 Container로 인해 만들어진 공개키이므로 키가 일치하지 않다는 에러가 발생하는 것이다.

해결책은 간단한데, known_hosts 파일을 아예 삭제하거나 known_hosts 파일에 기입된 내용을 전부 지워버리면 된다.

이 경우 known_hosts 파일에 저장된 공개키값이 없을 것이므로 Server Node에 접속할 때 해당 Node의 공개키를 known_hosts에 새로 저장한 이후 접속할 것이므로 문제를 해결할 수 있다.

필자는 맘 편하게 삭제하도록 하겠다.

삭제 이후 정상적으로 접근할 수 있음을 알 수 있다.

clear: command not found 에러

업로드중..

필자가 가장 애용하는 Linux 명령어는 clear와 vi이다.

그런데 clear Command가 없는 경우가 존재한다. 이 경우 clear Command를 포함하는 패키지를 설치하기만 한다면 바로 문제를 해결할 수 있을 것이다.

yum -y install ncurses

이 방식으로 ncurses 패키지를 다운로드한다면 바로 clear 명령어를 사용할 수 있음을 알 수 있다.

profile
혹시 틀린 내용이 있다면 언제든 말씀해주세요!

0개의 댓글