본문 바로가기

(Dev)Ops

ansible 개요와 사용법.

서버가 여러개 있는 경우, 패치 하나를 설치하더라도 여러 호스트에 반복 작업을 해야 하는 상황을 겪게 됩니다.

ansible은 이런 작업을 자동화해주는 툴입니다.

관련 툴이 몇가지 있지만, agent 를 사용하지 않고 ssh 를 사용하는 툴 중 대표주자이며, 따라서 간편하기 때문에 가장 많이 애용되는 것으로 알고 있습니다.

 

관리 대상이 될 서버를 docker 로 설치해봅니다.

 

https://skysoul.tistory.com/43

 

Docker를 이용한 Linux 설치. sshd 설정.

DevOps 관련 도구를 테스트해 보기 위해, Linux 머신이 필요했습니다. 이런 용도로 가볍게 쓰다 버릴 수 있는 구조로 만든 것이 Docker 아니겠습니까? Docker 로 Linux 를 설치해보았습니다. 먼저 docker 를

skysoul.tistory.com

 

관리 대상인 ubuntu 리눅스에 ansible 용 user 를 추가합니다.

 

> adduser ansible-user

 

sudo 패키지를 추가합니다. 보통의 리눅스에는 설치되어 있지만, Docker 용 리눅스는 minimal version 이라서 최소버전으로 구성되어 있습니다.

 

> apt-get install sudo

 

ansible-user 의 경우, sudo 명령 실행시에 비밀번호를 입력하지 않아도 되게 설정합니다. /etc/sudoers 에 아래 행을 추가합니다.

 

ansible-user ALL=(ALL) NOPASSWD:ALL

 

컨트롤을 할 서버(제 경우엔 개발 PC) 에 /etc/ansible/hosts 파일을 만들고 아래 내용을 넣습니다.

 

[testservers]

docker-ubuntu ansible_host=localhost ansible_port=1022 ansible_connection=ssh ansible_user=ansible-user

 

컨트롤 서버에서 관리 대상인 서버들에게 접근할 때, 비밀번호를 입력하지 않을 수 있어야 합니다.

먼저, 컨트롤 서버에서 SSH key 를 만듭니다.

 

> cd ~

> ssh-keygen

 

passphrase 를 입력하라고 나오는데요, 이 테스트를 위해서는 입력하지 않고 그냥 엔터 입력하셔도 됩니다.)

 

생성된 키를 리모트에 복사해두면 비밀번호 없이 접속합니다.

 

ssh-copy-id -p 1022 ansible-user@localhost

 

ssh 로 접속해보면 비밀번호 없이 바로 shell prompt 가 뜨는 것을 확인할 수 있습니다.

ansible 에서 ping 을 실행해봅니다.

 

> ansible testservers -m ping

 

여기까지 잘 따라왔다면, ping 결과가 SUCCESS 로 뜹니다.

 

아까 작성한 testservers 파일은 inventory, 즉 서버들의 리스트이구요, 실행할 내용은 playbook 이라고 부릅니다. 

아래 예제는 nginx를 설치하는 것으로 install_nginx.yml 로 저장하겠습니다.

 

---
- name: install nginx on the client
  hosts: testservers
  become: yes

  tasks:
      - name: install epel-release
        action: "{{ ansible_pkg_mgr }} name=epel-release state=latest"
      - name: install nginx web server
        action: "{{ ansible_pkg_mgr }} name=nginx state=present"
      - name: start nginx web server
        service: name=nginx state=started

 

become : yes 는 root 권한으로 실행하겠다는 의미입니다.

이 playbook 을 실행하겠습니다.

 

> ansible-playbook install_nginx.yml

 

epel-release 가 ubuntu 에서는 다른 이름인지, 패키지가 없다는 오류를 내긴 합니다만, 본 테스트의 목적인 관리 대상 서버에서 커맨드 라인을 실행하는 목적은 달성했습니다.

 

기타 참고 사항 ------

ansible-galaxy init nginx 를 실행하면 프레임웍에 맞춘 설정대로 폴더와 기본 파일들이 생성됩니다.

template 기능 : 특정 설정 파일을 타겟 호스트에 복사할 수 있습니다. 이 때 파일 내용에 변수를 적용할 수 있습니다.

handler 기능 : 특정 명령 성공 후 event 를 발생시킬 수 있습니다. event 를 받아 다른 명령어를 실행할 수 있습니다.