티스토리 뷰

지난 번에 IaC (Infrastructure as Code) 라는 개념에 대해서 소개하면서 Ansible이 무엇인지, 그리고 Packer라는 소프트웨어와 연동해서 Ansible을 사용하는 방법에 대해서 알아봤었다.

 

그 때 Packer Provisioner를 이용하는 방법 말고 Ansible을 직접 설치한 다음 원격 머신에 접속하는 방법도 있다고 얘기를 했었는데, 오늘은 그 방법에 대해서 이야기해보자.

 

일단 Ansible은 리눅스용 프로그램이라 일반적인 윈도우 PC에서는 설치할 수가 없다.

그래서 Ansible을 설치해 보려면 리눅스 환경을 만들어줘야 하는데 크게 두 가지 방법을 생각해볼 수 있다.

 

1) 리눅스 에뮬레이터인 Cygwin을 이용해서 설치.

2) VMWare나 VirtualBox 등을 이용하여 리눅스 가상 머신을 만들고 거기다 설치.

 

근데 1번은 전에 시도해본 적 있었는데 잘 안돼서... 이번 포스팅에선 2번 방법으로 설치를 해본다.

일단 VirtualBox를 깔고, 우분투 데스크톱 이미지를 준비하자.

 

VirtualBox 다운로드

Ubuntu 16.04 Desktop 이미지 파일 다운로드

 

가상 머신 2대를 만들 것이다. VM1에는 Ansible을 설치할 것이고, VM2는 Ansible을 통해서 원격 조종할 대상 VM이다.

VM 첫 실행 시 위에서 다운받았던 Ubuntu 이미지를 선택해서 부팅해주고, 설치 과정을 따라가주자.

 

설치가 끝났으면 잠깐 VM을 끄자. 한 가지 세팅해줘야 할 게 있는데, 네트워크 설정이다.

각 VM의 설정에 들어가서 '네트워크' > '어댑터 2' 탭으로 들어간 다음 '네트워크 어댑터 사용하기' 를 체크하고, '호스트 전용 어댑터' 를 선택해주자.

이렇게 하면 각 VM에 192.168로 시작하는 Private IP가 할당되는데, Ansible로 원격 접속을 하려면 IP 주소가 필요하기 때문에 그때 써먹기 위함이다.

 

그러면 VM1을 다시 켜서 Ansible을 설치해보자.

 

sudo apt-get install ansible

 

참고로 VM2에는 Ansible을 설치할 필요가 없다. Ansible과 유사한 다른 프로그램들 (Chef, Puppet 등) 의 경우 접속할 상대 컴퓨터에도 프로그램을 설치해야 동작하는 경우도 있는데, Ansible은 그렇지 않아서 편리하다. 이를 상대 컴퓨터에 에이전트 프로그램을 설치할 필요가 없다고 해서 Agentless 구조라고 부른다.

 

여튼 VM1에 Ansible을 설치했으면 /etc/ansible 폴더로 가보자. ansible.cfg라는 파일이랑 hosts라는 파일이 있다.

ansible.cfg는 설정 (config) 파일인데 우리는 그냥 기본적인 예제만 다뤄볼 거니까 이쪽은 건드리지 말자.

 

hosts라는 파일이 '원격 접속할 상대' 에 대한 정보를 써넣는 파일이다. Ansible에서는 inventory 파일이라고도 부르는데, 가장 기본적인 것은 상대의 IP 주소를 넣는 것이고, 도메인 주소를 넣을 수도 있다.

그룹을 지정한다던지 이름을 붙인다던지 하는 것도 가능한데 나도 아직 이걸 많이 다뤄보진 않아서 자세히는 모르겠다. 

 

VM2에서 ifconfig로 IP주소를 확인해보자. 192.168로 시작하는 주소를 기억해 둔다. 예를 들어서 VM2의 주소가 192.168.56.101이라면, VM1로 돌아가서 hosts 파일에 192.168.56.101 이라고 한 줄 써넣어 준다.

 

Ansible이 상대 머신과 제대로 통신할 수 있는지 체크해보기 위한 명령어 (정확히는 '모듈') 로 ping이 있다. 한번 제대로 동작하는지 확인해보자.

 

ansible all -m ping

 

all은 hosts 파일에 들어있는 모든 상대 머신을 대상으로 해당 명령을 적용하겠다는 뜻이고, -m ping은 ping이라는 이름의 모듈을 사용하겠다는 뜻이다.

 

하지만 제대로 실행되지 않고 아마 이런 에러가 뜰 것이다. 에러 메시지에서 알 수 있는 점은 Ansible이 SSH를 이용해서 원격 접속을 한다는 것이고, SSH와 관련해서 뭔가 문제가 생겼다는 것이다.

 

여기서 SSH 접속에 대한 기본적인 지식이 몇 가지 필요하다.

 

1) SSH는 클라이언트-서버 방식으로 연결을 수행한다. 즉 클라이언트 쪽에선 SSH 클라이언트 프로그램이, 서버 쪽에선 SSH 서버 프로그램이 깔려있어야 한다. 여기서는 VM1이 클라이언트, VM2가 서버고 VM1에선 Ansible이 SSH 클라이언트 프로그램 역할을 한다. 근데 VM2에 서버 역할을 할 프로그램을 깔아주질 않았다. 

 

그래서 VM2에 SSH 서버를 설치해줘야 한다.

 

sudo apt-get install openssh-server

 

2) SSH 접속은 그냥 시켜주는 게 아니라 인증이 된 클라이언트만이 접속할 수 있는데, 공개키 방식으로 인증을 한다. 공개키 방식 인증이라는 것은 '비밀키' 와 '공개키' 라는 두 개의 암호 키를 만들어놓고 공개키는 상대방에게 뿌리는 방식이다. 특정한 알고리즘에 의해서, 클라이언트에서 비밀키를 이용해서 사인을 하면 상대는 공개키를 이용해서 '이 사인이 그 클라이언트의 것이 맞다' 는 것을 확인할 수 있게 된다. 즉 이렇게 인증을 하려면 다음과 같은 절차가 필요하다.

 

- 비밀키와 공개키를 만들어야 한다: 우분투에 기본적으로 설치돼있는 ssh-keygen이라는 프로그램을 사용한다.

 

ssh-keygen -t rsa

 

뭘 입력하라는게 몇번 나오는데 그냥 엔터로 다 넘기면 기본값으로 키를 만들어준다.

기본적으로 (홈 디렉토리)/.ssh 라는 폴더 안에 id_rsa.pub라는 이름으로 파일이 생성된다. 들어가서 vi로 열어보면 ssh-rsa로 시작하는 암호가 보일 것이다. 이게 공개키다.

 

- 만든 공개키를 SSH 서버 쪽에 보내줘야 한다: 가장 먼저 떠오르는 방법은 메일이나 클라우드 스토리지같은걸 이용해서 보내주는 것이다. VM2 쪽에 .ssh/authorized_keys라는 파일을 만든 다음, 메일이나 스토리지에 올려뒀던 공개키 파일을 다운로드받고 그 내용을 복사해서 authorized_keys 파일에 붙여넣는 것이다.

이렇게 해도 되지만 좀 더 스마트한 방법으로는 리눅스의 scp (secure copy) 명령어를 이용하는 방법이 있다.

 

id_rsa.pub가 있는 .ssh 폴더 안에서,

 

scp id_rsa.pub (username)@192.168.56.101:id_rsa.pub

 

여기서 username은 VM2의 우분투 계정 이름이다. 실행하면 VM2쪽의 계정 비밀번호를 입력하라고 하는데, 비밀번호를 입력해주면 파일을 복사한다.

 

VM2의 홈 디렉토리를 살펴보면 id_rsa.pub가 생긴 것을 확인할 수 있다. 그 내용을 authorized_keys에 복사해주기 위해서는 다음의 명령어를 실행한다.

 

cat id_rsa.pub >> .ssh/authorized_keys

 

이제 VM2가 VM1의 공개키를 알게 되었고, VM1이 접속을 시도하면 이 공개키를 이용해서 인증을 할 수 있게 됐다.

다시 ansible all -m ping을 실행해보자. 초록색으로 뜨는 SUCCESS 메시지가 보인다면 성공이다.

참고로 위에서 설명한 공개키 전송 없이도 접속할 수 있는 방법이 있긴 한데, ping 뒤에 '--ask-pass' 라는 옵션을 붙여주면 공개키 기반 인증 대신 비밀번호를 이용해 인증을 한다.

그렇지만 공개키 기반으로 인증하는게 정석이고, VirtualBox에 우리가 구축한 환경에서야 이게 가능하지만 퍼블릭 클라우드의 경우 보안 정책상 비밀번호 인증이 막혀있는 경우도 있으므로 편하다고 이것만 믿진 말자.

 

마침 퍼블릭 클라우드 얘기가 나왔는데 VirtualBox로 만든 로컬 VM 말고 클라우드 VM을 대상으로도 실험해보자. 똑같이 하면 될 것 같지만 몇 가지 이슈가 더 있다.

 

지난 포스팅에서 했던대로 AWS EC2에 VM을 만들고 퍼블릭 IP주소를 확인하자.

그 다음 공개키 파일을 전송해주기 위해서 scp를 위와 같은 방식으로 써보면... 비밀번호 입력 대신에 Permission denied가 뜬다. 생각해보면 우리가 AWS EC2의 VM에 접속할 때는 비밀번호를 치는게 아니라 키 페어라는걸 이용해서 접속했었다. 이걸 이용해야 하지 않을까? 

 

-i 옵션을 주면 키 페어 파일 (.pem 확장자) 을 사용할 수 있다.

 

scp -i "keypair.pem" id_rsa.pub ubuntu@(VM_IP주소):id_rsa.pub

 

이렇게 했는데도 아래와 같은 에러가 뜰 수 있다.

 

해석을 해보면 개인키 파일은 타인에 의해 접근할 수 있는 상태여서는 안된다는 소린데, 파일에 대한 퍼미션을 변경해줄 수 있는 리눅스 명령어로 chmod가 있다. chmod 명령어를 이용해서 저 파일에 대한 퍼미션을 바꿔주면 해결된다.

 

chmod 400 keypair.pem

 

400이라는 숫자에서 백의 자리는 소유자의 권한, 십의 자리는 그룹의 권한, 일의 자리는 그 외 다른 유저의 권한을 뜻한다고 한다. 백의 자리가 4면 읽기 전용 모드이고, 나머지 자리는 0이니까 소유자 외에는 접근할 수 없다는 뜻인 것 같다 (아마도).

 

여기까지 하면 scp는 잘 동작한다. 공개키를 보내줬으면 이제 Ansible로도 접속이 가능할 것이다.

hosts 파일에 들어있는 IP 주소를 AWS EC2 VM의 퍼블릭 IP 주소로 바꿔주고, ping을 실행해보자.

 

안된다. 분명 공개키도 보내줬는데 왜 SSH 인증 오류가 뜰까? 여기서 한참 막혔었는데, 찾아보니까 username을 지정해주지 않아서 그렇다고 한다. 그게 뭔 상관인가 싶지만 한번 username을 지정해서 다시 실행해보자. username을 지정해주는 방법은 3가지 정도가 있다.

 

첫번째는 ping을 실행할 때 뒤에 --user 옵션을 주는 것이다.

 

ansible all -m ping --user=ubuntu

 

두번째는 hosts 파일의 IP주소 옆에 'ansible_user' 속성을 지정해주는 것이다.

 

(VM_IP주소) ansible_user=ubuntu

 

마지막으로 ansible.cfg 파일에서 remote_user를 바꿔주는 방법이 있다.

 

remote_user = ubuntu

 

이 remote_user 속성의 기본값은 root로 되어있다. 그러니까 username이랑 관련된 설정을 아무것도 안 주면 기본적으로 root로 접속한다는 뜻이다. 그런데 VirtualBox에서 로컬 VM을 만들었을 때는 접속이 됐는데, EC2 VM에는 접속이 안됐다. 추측으로는 EC2 VM의 경우 보안을 생각해서 root로 접속하는 게 기본적으로 막혀있는 것 같다.

 

username을 지정해주니 SUCCESS가 뜬다. 이제 ping 말고 playbook을 이용해서 명령을 내려보자. playbook은 지난 포스팅에서 얘기했듯 여러 Ansible 명령을 yaml 형식의 파일로 정의해서 편리하게 내릴 수 있는 도구다.

 

- hosts: all

  tasks:

        - name: install apache2

          become: true

          shell: apt-get -y install apache2

        - name: install php7

          become: true

          shell: apt-get -y install php7.0 libapache2-mod-php7.0

 

이 playbook을 실행하면 EC2에 있는 원격 VM에 apache2랑 php7.0을 설치해줄 것이다. playbook의 실행은 그냥 ansible이 아니라 ansible-playbook 명령으로 한다.

 

ansible-playbook playbook.yml

 

인터넷 브라우저에 EC2 VM의 퍼블릭 IP주소를 입력해서 apache 메인 페이지가 잘 뜨는지 확인해 보자. 안 뜬다면 보안 그룹 인바운드 설정에서 80번 (HTTP) 포트를 허용하고 있는지 체크할 것.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함