ansible로 리눅스 다중 서버 관리
시작하기 전
다수의 서버를 운용하다 보면, 사소하지만 귀찮은 애로사항에 시달리게 된다.
바로 서버 설정을 한 번에 바꾸는 상황이다.
예를 들면 서버의 비밀번호를 바꾸고 싶은데, 일일이 하나씩 접속하여 sudo passwd …을 하는 것은 매우 피곤한 일이다.
또한 그러다 한번 오타라도 나면 대참사가 발생한다…문제되는 서버를 찾아야 하고 거기서 어떤 오탈자가 있는지 찾아내야 하니….
이 고민을 하는 사람은 당연히 당직뿐만 아닐 테고,
그리하여 위대한 리눅스 개발자들은 다중 서버에 동일한 스크립트를 실행토록 하는 안시블ansible이란 팩키지를 개발하였다!
이 ansible를 활용하여 간단한 리눅스 작업을 진행해보자.
ansible 사용법
테스트 환경은 다음과 같다.
- ansible이 설치 될 호스트 서버
- Centos, Ubuntu 각 1대씩 총 3대
설치
yum(데비안은 apt-get) 을 사용해 호스트 서버에 ansible을 설치한다.
다만 안시블은 epel 레포지토리를 통해 설치되므로 epel-release를 사전 설치해 주자.
1
2
sudo yum install -y epel-release # ansible 설치를 위해서는 epel 레포 필요
sudo yum install -y ansible
ssh 연결
호스트 서버에 ansible을 설치했으면, 이제 이 서버와 나머지 서버들을 연결해줘야 한다.
ansible은 ssh 통신(22번 포트)를 사용하므로, 이 서버에서 나머지들에 ssh 접속할 수 있도록 환경을 구성해준다.
만약 AWS 서버같은 클라우드 컴퓨팅이라면 방화벽 설정에서 IP 허용 해줘야지?
ssh 연결을 하기 위해서는 공개키 생성이 필요하다.
공개키는 서버들이 공유하는 열쇠로, 원격 접속할 시 각 서버별로 있는 개인키(일종의 자물쇠)와 연동하여 허용 여부를 결정하는 형식이다.
공개키 생성은 아래와 같다.
1
2
ssh-keygen # 전부 엔터
cat ~/.ssh/id_rsa.pub # ssh 공개키 확인
참고로 공개키는 ~/.ssh/id_rsa.pub 에 존재한다.(물결표도 경로입니다) ~/.ssh/id_rsa는 개인키이고
이제 이 공개키를 다른 서버들이 알아야 하므로(즉 서로 연결을 허용한다는 것) 공개키를 전송해주자.
1
2
# 이 ssh 공개키를 연결하려는 서버로 전송
ssh-copy-id (연결하려는 서버 계정명)@(연결하려는 서버 IP/호스트)
전송된 공개키는 ~/.ssh/authorized_keys 에 저장되어 있다.
이 파일을 cat으로 열어보면 맨 뒤에 계정명@호스트 IP가 나와 있는데, 이 말은 즉슨 호스트 서버의 이 계정에서만 ssh 접속 가능하다는 뜻이다.
만약 root 상태에서 ssh-copy-id 를 했으면 아래 그림의 centos는 root로 바뀌었을 것이다!
실제로 연결테스트를 해 보려면 호스트에서
1
ssh (연결하려는 서버 계정명)@(연결하려는 서버 IP)
이렇게 하면 된다.
ansible 환경 구성
ansible에 연동될 서버 목록은 /etc/ahsible/hosts에서 설정 가능하다.
1
2
3
sudo vi /etc/ansible/hosts
# 연결하고자 하는 서버의 IP 입력
# ansible_user=
위 그림처럼 되어 있는데, [이름] 은 서버 그룹이다. ansible A 어쩌구… 하면 A 그룹에만 ansible을 실행시키는 식이다.
당직은 위 그림처럼 하였다.
여기서 주의할 점은 ansible_user인데, ansible은 기본적으로 호스트 계정과 동일한 이름으로 다른 서버에 접속하기에, 호스트 계정명과 동일한 계정이 타 서버에 없으면 연결 오류가 뜬다.
그리하여 계정명이 다른 서버(위 예에서는 ubuntu)에서는 ansible_user 옵숀을 추가로 한 것이다.
ansible 연결 테스트는 아래와 같다.
1
ansible (IP, 호스트, 또는 그룹명) -m ping
플레이북 작성
안시블은 플레이북 파일이라는 야믈(yml)파일을 실행시켜 작동한다.
이 야믈파일은 굉장히 옵숀이 많아 자세한 사항은 여기로
당직은 아래와 같이 아~주 기본적인 플레이북을 작성하였다.
- name 은 작업 이름
- hosts는 실행할 서버(군)
- tasks는 작업에 포함되는 써브작업들
- command는 실행할 리눅스 스크립트 이다.
즉 위 그림은 echo 명령어를 실행하는 subtask1 으로 이뤄진 test 작업인 것이다.
이 작업을 실제로 실행하려면
1
ansible-playbook (플레이북 파일)
이렇게 실행이 된다!
우선 서버 연결상태를 확인한 다음, 작업을 실행한다.
실제로 서버에 들어가 로그를 확인해 보면 명령어가 실행되었음을 확인할 수 있다!