본문 바로가기
Infra & DevOps/Ansible

처음부터 설치하며 배우는 앤서블(Ansible) 강의록

by Jordy-torvalds 2020. 8. 23.
반응형

앤서블 강의를 통해 배울 수 있는 것.

  • 앤서블의 설치 및 구성
  • 앤서블의 구성요소
  • 앤서블을 통해 대규모 배포 실습 가능

왜 앤서블인가?

앤서블과 같은 툴을 Configuration Management Tool (설정 관리 도구) 라고 합니다. 이러한 툴을 퍼펫과 쉐프, 솔트가 있습니다. 앤서블과 함께 구성 관리 4대 천왕이라고 부릅니다.

Configuration Management Tool 비교

퍼펫

  • 설정 관리 툴의 선두주자.
  • 기술적 복잡도가 높음
  • 그래서 도입한 기업이 많은데, 그만큼 정보량이 많지만. 기존 설치 시스템과의 의존성 때문에 변경이 쉽지 않음.

쉐프

  • 많은 도입 고객이 있고 정보량이 많음.
  • 기술적 복잡도가 높음.

솔트

  • 정보량도 적고, 발전속도가 높지 않음.

앤서블

  • 다른 툴과 다르게 agentless인데, 이러한 특성은 파이썬 그룹의 전폭적인 지원을 받게 해주었음.
  • 기술적인 복잡도 또한 낮음.
  • YAML 방식을 사용.

데브옵스 툴 트렌드 지표

앤서블 실습 환경 구성

앤서블 실습 구성도

앤서블 지원 운영체제

윈도우를 앤서블로 관리하는 것은 가능하지만, 윈도우에 앤서블을 설치를해서 다른 운영체제를 관리하는 것은 불가합니다.

.

실습은 CentOS로 진행. 그 이유는 국내 시장에서 가장 많이 사용되는 레드햇 플랫폼을 그대로 복잡해서 만든 OS 이기 떄문에 실무와 유사한 실습 환경 구성이 가능하기 때문입니다.

앤서블 코어 설치 및 운영

앤서블 코어란?

  • 앤서블를 사용하는데 핵심이 되는 구성 요소.
  • 동작에 필요한 최소한의 패키지를 포함하고 있음
  • 실행 명령어와 옵션으로 구성.
  • 이를 패키징 하여 편의성을 높이고 GUI, 가시성 향상을 한 것이 앤서블 타워! (유료)
  • 이전 진도 사진에 나오는 ansible-server에 설치됨.
  • agentless 방식이므로 다른 node에는 설치되지 않음.

설치 방법

(1) ansible-server 접속

(2) ping [google.com](http://google.com)

: 앤서블 패키지를 받기 전에 구글로 핑을 보내봄으로써, 인터넷 정상 접속 가능 여부를 체크 합니다.

: 안되면 /etc/resolv.conf 에 DNS 서버를 추가해주셔야 합니다.

(3) yum install epel-release

: epel-release를 설치 합니다.

: EPEL(Extra Packages for Enterprise Linux)은 Fedora Project에서 제공되는 저장소로 각종 패키지의 최신 버전을 제공하는 community 기반의 저장소입니다.

(4) yum install -y ansible 실행

: ansible을 설치하는 명령어 입니다.

(5) ansible all -m ping

: 등록된 전체 호스트에 핑을 날리는 명령어인데 호스트가 등록되지 않아서 실행이 불가합니다.

(6) 앤서블 관리 대상 호스트 설정

(6-1) 호스트 설정 편집기 열기 및 최하단에 아이피 추가

vi /etc/ansible/hosts

(7) ansible all -m ping- k

: 다시 핑 테스트를 실시합니다.

: 제일 오른쪽에 붙은 k옵션은 공개키 교환을 스킵하는 명령어 입니다, 붙이지 않으면 통신 실패가 되는데 그 이유는 차후에 확인 후 추가하겠습니다.

: 위 명령어 입력 후, root 계정의 비밀번호도 입력하면 아래와 같이 화면에 출력됩니다.

앤서블의 구성 요소와 명령어 플래그

앤서블의 구성 요소

/etc/ansible/ansible.cfg - 환경 설정 파일

/etc/ansible/hosts.cfg - 앤서블이 접속하는 호스트들에 대한 정보

[groupName] # 아래 아이피를 하나의 그룹으로 묶어서 호출하고 처리하는 것이 가능.
1.1.1.1
2.2.2.2
3.3.3.3

# ansible groupName -m ping -k 를 실행하면 groupName에 속하는 1.1.1.1, 2.2.2.2, 3.3.3.3
# 에게 핑이 보내지게 된다.

서블 명령어 플래그

1) -i or --inventory-file

: 적용될 호스트 정보를 담긴 파일을 읽어서 명령어 실행에 참조

: 예를 들어, ansible all -m ping -k 를 했을 때 기존에는 1.1.1.1, 2.2.2.2, 3.3.3.3 에게 핑이 보내졌다면

1.1.1.1

2.2.2.2

란 텍스트가 담긴 test란 파일이 있고 ansible all -i test -m ping -k 명령어를 실행하면 1.1.1.1과 2.2.2.2에게만 핑이 보내진다.

: 이 명렁어 플래그는 특정 노드에 대상으로만 명령어를 보내고 싶을 때 활용할 수 있다.

.

2) -m or --module-name

: 파이썬으로 작성된 모듈을 선택하여 특정 호스트에게 실행하는 플래그.

: ansible all -m ping -k 를 할 경우 linux에서 지원하는 ping 명령어가 아닌 파이썬으로 작성된 ping 모듈전체 호스트를 대상으로 실행한다.

.

3) -k : --ask-pass

: 패스워드를 물어보도록 설정

.

4) -K : -- ask-become-pass

: 명령어에 따라 관리자 권한이 필요할 때 비밀번호 검증 후 권한을 상승 시켜주는 플래그

.

5) --list-hosts

: 명령어 실행시 적용되는 호스트 들을 확인. 실제 명령어가 실행되지는 않음.

: 결론적으로 명령어 실행 전 영향을 받는 호스트들을 확인할 수 있습니다.

한 번의 명령어로 다수의 시스템 작업하기

시스템 작업 목록

1) 업타임 확인 하기

ansible all -m shell -a "uptime" -k

# /etc/ansible/hosts에 등록된 전체 호스트를 대상으로 쉘 모듈을 실행
# 쉘 모듈은 리눅스 명령어를 실행하는 모듈로, -a 뒤에 실행할 명령어를 할당하면 됨.

.

2) 디스크 용량 확인 하기

ansible all -m shell -a "df -h" -k

# 위와 동일, 다른 점은 df -h로 디스크 사용 현황을 체크
# df의 h 플래그는 "human readable" 의 약자

.

3) 메모리 확인 하기

ansible all -m shell -a "free -h" -k

# 위와 동일

.

4) 유저 생성하기

ansible all -m user -a "name=jordy password=1234" -k

# user 모듈 사용.
# 인수로 name과 password를 주면 생성 가능.
# password는 평문을 줘서는 안되고, 암호화된 텍스트 값을 넣어줘야 
# 명령어가 실행될 호스트에 정상적으로 1234가 들어가게 됨.

.

5) 파일 전송하기

ansible nginx -m copy -a "src=~/test dest=~/test" -k

# nginx 그룹을 대상으로 명령어 실행
# copy 모듈 사용
# 인수로 src / dest 를 줌
# src는 앤서블 코어에서 보낼 파일의 경로를 지정
# dest는 파일을 수신할 호스트의 파일 경로를 지정
# 로그를 볼 때 전송시 /root/.ansible/tmp/ 에 임시로 보낼 파일을 생성한 후에 보내는 것으로 보임.

.

6) 서비스 설치하기

ansible nginx -m yum -a "name=httpd state=present" -k

# nginx 그룹을 대상으로 명령어 실행
# yum이란 리눅스 명령어가 아닌 모듈을 사용
# 인수로 name / state 를 사용
# name은 설치할 패키지 명을 적음
# state는 설치 후 상태를 적음. 여기서는 존재해야 한다고 명시함.

yum list installed | grep httpd

# 개별 호스트 내 httpd의 정상 설치 여부 확인

ansible nginx -m shell -a "yum list installed | grep httpd" -k

# 앤서블 각 호스트의 설치 결과를 확인하는 것 또한 가능
# 하지만, 위 명령어 실행시 앤서블의 yum 모듈 사용을 권장하는 경고 문구가 출력됨.

기존의 관리 방식과의 차이점은?

  • 사실 ansible 명령어에 아규먼트로 리눅스 명령어를 줘서 동일하다고 느껴질 수도 있겠다.
  • 하지만, ansible로 중앙 관리가 가능하다는 점에서 그 가치가 높다.
  • /etc/ansible/hosts 에 호스트 정보와 접속 정보만 등록해두면 ansible 서버 하나로 수많은 서버에 대한 관리가 가능하므로 아주 편리하다.

플레이북의 정의와 필요성

플레이북이란?

사전적 의미는 각본, 작전, 계획을 뜻함.

예를 들어 수천개의 서버에 웹서비스를 설치 및 기동한다고 했을 때 아래와 같은 프로세스로 진행되게 된다.

nginx 웹서버 설치 → 주요 페이지 전송 → 서비스 재시작

이러한 프로세스를 정의 해놓은 것이 플레이북이다.

플레이북은 멱등성(idempotent) 이란 특성이 있는데, 여러 번 연산을 실행해도 결과가 바뀌지 않는 특성을 말한다.

플레이북 작성 법

---
- hosts: nginx
  remote_user: root
  tasks:
    - name: install epel-release
      yum: name=epel-release state=latest
    - name: install nginx web server
      yum: name=nginx state=present
    - name: Upload default index.html for web server
      copy: src=index.html dest=/usr/share/nginx/html mode=0644
    - name: Start nginx web server
      service: name=nginx state=started

# hosts : 실행할 호스트명 혹은 그룹 명
# remote_user: 원격지 사용자 계정 정보
# task: 실행할 작업들
# name: 사용자가 설정하는 작업의 이름
# yum / copy / service : 실행할 모듈
---
- name: write_hosts
  hosts: localhost

  tasks:
    - name: add ansible hosts
      blockinfile:
           path: /etc/ansible/hosts
           block: |
                [nginx]
                10.20.0.14

.

Ansible 전용 vim 플러그인 설치 방법

# 참고 사이트: https://github.com/junegunn/vim-plug
# 참고 사이트2: https://github.com/pearofducks/ansible-vim

# vim 전용 rc 생성
vi ~/.vimrc

# 아래 내용 작성
call plug#begin('~/.vim/plugged')
Plug 'pearofducks/ansible-vim'
call plug#end()

# vim 기본 편집기 실행
vim

# 플러그인 설치
:PluginInstall

# alias로 vi 실행시 vim이 실행되도록 변경
vi ~/.bashrc

# .bashrc 파일 내에 아래 내용 추가
alias vi=vim

YAML 작성시 발생하는 에러를 보기 쉽게 만드는 법

vi /etc/ansible/ansible.cfg

# 아래 문구를 주석 해제 하고 skippy에서 debug로 변경

#stdout_callback = skippy
반응형