DNF 사용하기

CentOS 8 로 넘어오면서 기본 패키지 매니지먼트로 dnf 가 되었다. 여전히 yum 을 지원하지만 앞으로는 dnf 로 쭉 간다고 하니 이참에 배워보자고 생각하지만….

겁나 빡치는게, 이제 그만 바꿨으면 한다. 뭔 yum 정도로도 충분히 잘 쓰고 있고 괜찮다고 싶다. 무슨 겁나 가볍네, 더 빠르네 어케 좋네… 응 yum 도 그렇게 느리고 그렇게 무겁지도 않아! 도대체 뭘 할때마다 갈아 엎고 이걸 새로 배우라고 하니.. 뭐 어쩌것나.. 그렇게 하겠다는데, 닥치고 배워야지!

dnf

햐.. 쓰기도 귀찮다… “DNF is the next upcoming major version of YUM, a package manager for RPM-based Linux distributions” 이렇게 맨 페이지에 설명이 나온다.

사용법

사용법은 아주 간단하다. yum 의 기본 사용법은 대동소이하다고 하겠다.

이정도만 알아도 패키지를 다루는데는 문제가 없을 것이다.

Ubuntu, systemd-networkd 전환하기

Ubuntu 16.04 로 넘어오면서 SysV 의 Init 이 Systemd 로 변경되었다. 이런 변화에는 Network 관리에도 적용되고 있는데, 이에 대해서 알아보자.

기존의 Network 관련된, 정확하게는 Network Interface 와 관련된 일은 NetworkManager 가 담당했다. Network Interface 가 무엇인지, 아이피는 DHCP 혹은 Static 인지 등이 그것이다.

하지만 Ubuntu 16.04 로 넘어오면서 시스템에 관련된 일체가 systemd 로 통합되면서 네트워크 관련 작업도 systemd 로 통합되어지게 되는데, 이것이 systemd-networkd 이 이다.

하지만 Ubuntu 18.04 로 넘어온 시점에서도 NetworkManger 는 이전과 호환을 위해서 살려뒀고 살려둔김에 지금도 기본적인 네트워크 설정 프로그램으로 활약(?) 하고 있다.

Network Manager

Network Manager 의 동작은 다음의 명령어로 이루어진다.

관련 설정은 /etc/NetworkManger/NetworkManger.conf 파일이다. 위 프로그램을 실행하게 되면 기본적으로 이 파일을 읽게 되어 있다.

그리고 netplan 설정에서도 NetworkManager 를 기본으로 지정하도록 되어 있다.

Network Manager 비활성화

비활성화는 다음과 같이 하면 된다.

이렇게 하면 네트워크가 비활성화 됨으로 절대로 원격지 서버에서 하면 안된다.

systemd-networkd 활성화

netplan

systemd-networkd 를 활성화하면 이제 네트워크 작업은 netplan 명령어를 통해서 이루어진다. 이 netplan 명령어는 기본적으로 ‘/etc/netplan’ 디렉토리에 파일을 읽어서 네트워크 설정을 적용해 준다.

‘/etc/netplan’ 디렉토리에 설정파일은 기본적으로 yaml 파일형식을 가진다. 예를 들면 다음과 같다.

파일을 수정한 후에는 다음과 같이 명령어만 주면 적용이 된다.

‘–debug’ 는 제외해도 된다.

기업이 프리랜서를 정규직으로 뽑지 않는 이유

나이가 먹어가면서 이런 저런 사회현상에 대한 답을 얻어가는 것 같다. 과거 어렸을적(?) 에는 그것이 왜 그렇게 되는지에 대한 의문만 가득했지만 시간이 약이라고 했던가…

한국 사회에서 나이가 가지는 특별함으로 인해서 나도 모르게 이제는 아랫사람이 생기고 과거에 윗사람에게 존댓말을 했던 내가 이제는 존댓말을 받을 위치에서 사회를 바라보게 됨에 따라서 과거에 못보던 것이 이제는 보이는 신기한 현상을 자주 겪는다.

개인적인 경력을 이야기를 하면 정규직 생활을 약 7년 정도하고 프리랜서로 전향한지 이제 약 5년쯤 됐다. 중간에 약 1년 쯤 놀았으니까 프리랜서를 개월수로 환산하면 만 4년 조금 될까…

지금도 그렇지만 과거에 이런 의문을 가진적이 있다.

다 똑같은 IT 기술을 가지고 일을 하는 사람들인데, 어째서 좀 나간다하는 기업에서는 프리랜서들을 정규직으로 고용하려고 하지 않는가?

과거에 가졌던 의문인데, 요새 그것이 정말로 맞는 말이라는 것을 절감한다.

새로운 프로젝트에 투입되고 새로운 인력을 뽑아 프로젝트를 지휘해야하는 입장에 있다. 문제는 SI 프리랜서에게 지급되는 월별 단가라는 것이 프리랜서 경력만 가지고 결정된다.

아무리 능력이 좋다고 한들 5년차라면 돈을 많이 못 받는다. 아무리 능력이 없다고해도 경력이 15년차면 특급대우를 해준다. 이력서에 많은 프로젝트를 뛰었다는 것이 그 사람의 IT 능력을 증명한다는 것이 웃기는 일인과 동시에 의문인데 이러한 의문 때문에 과거에 저런 질문이 절로 떠올라고 과연 맞는 말이라는 것을 절감한다는 것이다.

나랑 같이 투입된 15년차 프리랜서가 있다. 나이도 많아서 부장이라고 달았는데, 그야말로 기계적인 일만 한 경우였다. 그리고 그렇게 기계적인 일만으로 단가를 높게 받다보니 그것을 벗어나는 일은 절대로 하려고 하지 않는다.

더 웃긴건 한국 사회도 변화하고 있고 IT 세계도 그 변화에 흐름은 빗겨가지 못하고 있는데도 과거에 했던 버릇을 버리지 못하고 있다는데 있다.

한국 사회에서 저작권에 대한 생각이 많이 바뀌어 있고 그래서 요새 젊다하는 프리랜서들은 나름대로 소프트웨어 저작권에 대한 인식이 잘 갖춰져 있다. OS, MS Office 등은 업무에 필요한 필수 소프트웨어도 과거에 비해서 나름 저렴해진 것도 한 몫이다.

하지만 나랑 같이 투입된 15년차 프리랜서… MS Office 는 2007년 버전이고 그것도 크랙 버전이다. 사업장 마다 다르지만 소프트웨어 라이센스에 민감곳이 점점 많아지고 있는 시점이고 내가 있는 사업장도 불법 소프트웨어에 대해서 그렇게 좋게 보지 않는다. 한번 걸리면 사업장이라고 책임을 면할 수 있는 상황도 아니기 때문이지..

그래서 크랙 버전은 사용하면 안되고 문제가 될 거 같으니 돈 주고 사라고 권했다. MS Office 365 의 경우에 비지니스 버전 1년 구독으로 12만원이면 사용할 수 있다. 프리랜서 15년차면 단가가 적어도 700 은 넘을테니 1년 12만원 그냥 껍 아니겠나..

하지만 이 양반.. 그 돈이 아깝다는 거다. 계약을 체결한 회사가 제공해주지 않느냐는 질문부터 해서 어떻게든 싸게 구매할려는지 이커스 마켓에서 출처도 불문명한 3만원짜리 라이센스 구매가 어떠냐고 내게 물어보기까지…

더 웃긴건, 이 프로젝트에 투입된 그 인력은 인프라를 담당하는 사람이다. OS, Application 서버등을 운영, 모니터링, 장애대응이 주 임무다. IT 그것도 인프라 운영에 발을 들여논 순간부터 24시간 장애대응은 염두해 둬야하는 직업이다. 하지만 이 양반 집에 컴퓨터가 없다.

장애가 발생하면 집에서 회사까지 출근해서 할 사람으로 보이지도 않는데도 “어? 집에 컴터 없어요” 를 아주 대놓고 당당하게 하는 사람…

사업장에서는 그래도 야밤에 출근하는 불상사를 없애기 위해서 원격 접속 프로그램을 지원해 주고 있다. 실시간 대응이 필요한 서비스의 경우 이렇게 해주는 곳이 많은데 “어? 집에 컴터 없는데요~” 를 당당하게 말할 수 있는 배짱, 아니 객끼를 들어내는 사람..

나 같아도 정규직으로 안 뽑는다.

이 글을 읽는 사람이라면 프리랜서 전체를 매도하는게 아니냐고 하겠지만 안타갑게도 저렇지 않는 프리랜서 본적이 없다. 계약서를 따지고 단가를 계산하고 사업장에서는 정규직과 동일한 복지를 요구하면서도 진정으로 개인사업자에 준하는 대우와 그에 맞는 결과를 요구하면 그것이 매우 부당하다고 주장하는 이들… 출퇴근은 칼같이 지켜내야만 한다고 주장하는 사람… (원래 프리랜서는 출퇴근 개념이 없다.)

한국 사회에서 공무원들을 영혼없는 사람처럼 대하는데, 한국 프리랜서들도 별반다르지가 않더라는 거다. case by case 대로 Tip 을 많이 알고 있는 것이 한국 IT 인력들의 능력 수준일 뿐이다. 그것을 조금만 벗어나면 뭘 어쩌지 못하는 무능을 금방 들어내고야 많은 선배님들… 제발 빨리 은퇴하시고 치킨집 차리시길 권한다.

쿠버네티스(Kubernetes) 개념

쿠버네티스(Kubernetes) 처음 접하면 개념 잡기를 해야 한다. 쿠버네티스를 잘 사용하기 위한 사용법을 익히는것도 중요하지만 개념을 이해하고 나면 외워서 문제해결을 하는 것이 아닌 응용력이 생겨 예기치 않은 장애를 겪을때에 힘을 발휘한다.

개인적으로 쿠버네티스의 개념을 이해하는데 약간의 혼란이 있었다. 개념을 설명하는 용어와 실제 작업을 할때에 사용하는 단어, 명령어들이 다 틀리게 사용되고 있는데서 오는 것이였다.

Master/Worker

다들 알다시피 쿠버네티스는 Master Node와 Work Node 로 구성된다. 대부분 Work Node 가 Master Node 보다 훨씬 많고 대부분의 서비스들이 여기에 배포되어진다.

Node 라는 단어를 빼버리고 단순히 Master/Worker 라고도 하지만 그냥 Master/Node 라고 하기도 하는 모양이다. 하지만 정확하게는 Master Node, Worker Node 라고 불린다.

또, Master Node 를 Controller 라고도 한다. Master 의 역활이 Worker Node 를 모니터링, 감시를 하고 각종 명령어을 Master 가 받아서 처리한다. 이 Master Node 는 거대한 Controller 서버 역할이라고 보면 된다.

kubectl – ResTful API

Master 가 거대한 Controller 서버라면 클라이언트를 이용해서 이 서버에 명령을 보내면 될 것이다. 이 클라이언트가 바로 kubectl 이라는 커맨드가 수행한다. 서버-클라이언트 구조상 서버는 1대지만 클라이언트는 여러대 일 수 있다. 실제로 kubectl 은 단일한 명령어로서 도커(Docker), 컨테이너(Container) 등도 필요없이 동작한다. 그래서 클라이언트는 어느 머신이든지 다 설치/사용이 가능하다.

kubectl 은 클라이언트, Master Node 는 Controller 서버다. 이 둘이 명령어를 주고 받는 방법이 바로 RESTFul API 통신 방법이다.

ResTful API 는 HTTP 를 이요해 URI 에 자원(Resources) 을 명시하고 메소드(Method) 를 이용해 CRUD 연산을 수행한다.

쿠버네티스(Kubernetes) 에서 중요한 것이 바로 자원이다. ResTful API 를 이용해 어떤 작업을 명령할때에 반드시 대상이 필요한데, 이것이 바로 자원이다.

Object, Resource, Kind

쿠버네티스(Kubernetes) 에서 개념을 설명할때에 오브젝트(Object) 라는 말을 쓴다. 오브젝트라고하면 쿠버네티스를 구성요소쯤으로 이해하면 된다. 예를들어 Pods, Service, Volume, Namespace 등은 쿠버네티스의 기본 오브젝트라고 불린다.

문제는 이러한 오브젝트들이 때로는 자원(Resource), 때로는 종류(Kind) 로 불린다.

자원 ResTful API 관점에서 실체적인 존재로서 호출하는 오브젝트들이다. 실제로 kubectl 커맨드를 사용할때에는 ‘오브젝트를 명시한다’ 하지 않고 ‘자원을 명시한다’라고 한다. ResTful API 개념을 차용했기 때문에 ‘자원을 명시한다’라고 해야 맞다.

위 결과를 보면 자원(Resource) 목록에서 오브젝트들도 볼 수 있다. 물론 오브젝트는 개념화된 추상적 그야말로 개념이고 자원을 실체적인 대상으로서 차이를 보이지만 이들에 명명된 말이 모두 같다. 맨 오른쪽에 KIND 도 보인다.

종류(Kind) 는 보통 Pods 를 생성하거나 업데이트를 하기위한 매니페스트(Manifest) 파일 작성시에 사용된다. 종류(Kind)는 쿠버네티스 자원 종류를 말한다. 매니페스트 파일은 JSON, YAML 포맷형태인데 예를들면 다음과 같다.

kind: Pod 라는 것이 보인다. 매니페스트 파일에서 자원이라고 하면 그야말로 컨테이너가 사용할 컴퓨터 하드웨어 자원을 말한다. 그래서 Resource:Pod 라고 한다면 문제가 되니까 Kind 라는 것으로 바꾼거 짐작이 된다.

이 kind 가 궁금하다면 ‘kubectl api-resources’ 명령어를 호출하면 자원에 붙여진 kind 를 볼 수 있다.

어느 방향으로 이해하느냐가 관건

쿠버네티스가 다루는 자원의 방향으로 접근해 이해하는 것도 괜찮다. 아니면 추상화 개념으로서 개념을 이해하고 가는것도 괜찮다.

다만, 완전히 추상적인 개념과 실제적인 대상을 구분하고 연결짓는 것이 머리속에 체계적으로 저장하는 방법이 될 수 있다.

kubectl 원격 접속 설정

kubectl 은 Kubernetes Client 이다. 이 명령어는 HTTP 통신을 기반으로 Kubernetes Controller 와 RestFul API 통신을 요청하고 결과를 받아 사용자에게 출력하게 하는 역할을 한다.

HTTP RESTFUL API 통신을 한다는 말을 듣는 순간 직감했겠지만 인터넷만 된다면 kubectl 은 어느 컴퓨터에서든 실행이 가능하다. 처음 Kubernetes 설치문서들을 보면 대부분 Master Node 에서 실행되도록 설정을 하는데, 여기서는 다른 컴퓨터에서 kubectl 만 설치해서 Kubernetes Controller 와 연결하는 방법에 대해서 살펴보도록 할 것이다.

설치환경

설치 환경은 Mint Linux 19.2 – XFCE4 환경에서 진행했다. kubectl 를 실행하는 환경는 다양하겠지만 제일 편한 것으로는 Unix 환경일 것이다. Mac OS X, Linux 가 가장 적합한데, 필자는 Mint Linux 19.2 – XFCE4 데스크탑을 사용하고 있음으로해서 이 환경에서 진행하게 됐다.

Mint Linux 19.2 는 Ubuntu 기반이기 때문에 Ubuntu 에서 설치, 설정 모두 동일하다고 생각하면 된다.

kubectl 설치하기

Mint Linux 19/2 에서 설치하는 방법은 Ubuntu 에서 설치하기와 동일하다. 단, 여기서는 kubectl 패키지만 설치하면 된다. root 계정으로 다음과 같이 한다.

설치는 별다른 이상이 없는한 문제 없이 진행된다.

kubectl 설정하기

kubectl 명령은 일반계정으로 사용하길 권고 하기 있다. kubectl 은 일반 계정에서 .kube/config 파일을 참조한다. 파일의 내용을 볼수도 있지만 다음과 같이 명령어로도 같단히 확인할 수 있다.

config 설정을 kubectl config 명령어를 통해서 가능하지만 복잡해 보인다. 손쉬운 방법을 찾게 되는데, 그 방법은 바로 Master Node 를 초기화 할때에 나오는 것을 참고하면 된다.

Master Node 초기화 때 나오는 출력에 설정관련 내용이 나온다. Master Node 에서 Mint Linux 19.2 에 일반계정으로 config 를 복사해보자.

이렇게 한 후에 다음과 같이 샘플 명령어를 쳤을때에 나오면 정상이다.

Kubernetes 설치

Kubernetes 설치에 대해서 다룬다. 설치를 위한 환경은 다음과 같다.

  • Master
    • Distribution: Ubuntu 18.04
    • IP: 192.168.96.14
    • hostname: kmaster
    • account: systemv
  • Worker Node
    • Distribution: CentOS 7
    • IP: 192.168.96.15
    • hostname: knode
    • account: systemv
  • CNI: Flannel

공통 설정 부분

sudo 권한 추가

Master, Node 두 서버 모두 Static IP 주소를 가지고 있어야 한다. 그리고 모두 일반 계정을 가지고 있어야 하며 이 일반 계정은 sudo 사용 권한을 가지고 있어야 한다.

CentOS 7 의 경우에 일반 계정을 생성한 후에 sudo 권한을 주고 싶다면 다음과 같이 하면 된다.

CentOS 7 에는 wheel 라고 하는 특수한 그룹이 존재하는데, sudo 설정에는 이 그룹에 한해 sudo 사용 권한을 부여하고 있어 일반계정 systemv 에 sudo 를 사용하게하고 싶다면 wheel 그룹에 포함시키면 된다.

Ubuntu 18.04 에서는 다음과 같이 일반계정을 sudo 권한을 줄 수 있다.

br_netfilter 모듈 로딩

br_netfilter 커널 모듈을 로딩해 줘야 한다. 기존에는 modprobe 설정으로 했지만 이제는 systemd 를 활용하면 되는데 ubuntu 18.04, CentOS 7 이 모두 이를 사용하고 있어서 적용 가능하다.

다음과 같이 모듈이름으로 conf 파일을 생성해 준다.

물론 이렇게 하면 시스템을 재부팅을 하더라도 자동으로 모듈이 로딩 된다.

커널 네트워크 파라메터

다음과 같이 커널 파라메터를 수정해 줘야 한다.

/etc/hosts 파일 편집

Master, Node 서버 양쪽 모두에 /etc/hosts 파일에 각 서버 정보를 다음과 같이 입력해준다.

swap off 설정

양쪽 모두 swap 을 off 해준다.

그리고 반드시 /etc/fstab 에서 swap 관련 마운트 설정을 주석처리 해준다.

CentOS 7 에서 설정

SELinux off

CentOS 7 에서 설정은 SELinux 설정이다. 다음과 같이 해준다.

firewalld 비활성화

이것은 systemctl 로 다음과 같이 가능하다.

패키지 설치

Ubuntu 에서 설정

패키지 설치

Docker 설치 및 설정

Kubernetes 는 Docker 를 기반으로하는 서비스다. 당연히 설치를 해줘야 하는데, 설치 관련 내용은 다음에 링크에서 각 배포판마다 잘 설명되어 있다.

한가지, Docker 설치를 위한 패키지 저장소는 명령어와 파일을 생성하는 방법 두가지가 있다.

ubuntu 18.04

ubuntu 에서는 add-apt-repository 명령어로 저장소 URL 을 추가 가능하다. 예를 들면 다음과 같다.

하지만 파일을 추가하는 방법으로 가능하다.

CentOS 7

CentOS 7 에서는 yum-config-manager 명령어를 이용해서 추가할 수 있다. 이 명령어는 yum-utils 패키지에 포함되어 있어 설치하면 사용할 수 있다.

다음과 같이 파일을 추가하는 방법도 있다.

Cgroup driver 설정

Kubernetes 를 설치할때에 Cgroup driver 를 systemd 로 추천하고 있다. 그래서 Kubernetes 만 systemd 로 드라이버를 교체하면 docker 와 통신이 되지 않는다. 이것을 위해서 Docker 에서도 드라이버를 systemd 로 교체해 준다.

다음과 같이 확인 가능하다.

Kubernetes 설치

Ubuntu 18.04

Ubuntu 18.04 에서는 다음과 같이 Kubernetes 패키지 저장소를 추가 한다.

다음과 같이 kubeadm, kubelet, kubectl 을 설치해 준다.

CentOS 7

CentOS 7 에서는 다음과 같이 Kubernetes 패키지 저장소를 추가 한다.

Master 설정

Master 를 만드는 것은 kubeadm 을 이용한다. 일반 계정으로 실행 한다.

Kubernetes Master 명령은 전부 일반계정으로 하도록 되어 있는데, 위 출력에 나온대로 설정을 해준다.

하지만 문제가 있다. 다음을 보자

kmaster 가 ‘NotReady’ 로 나오고 coredns 상태가 ‘Pending’ 이다. kubelet 로그를 보자.

NetworkPlugin 이 없어 오류가 나오는 것으로 이는 CNI(Container Network Interface) 를 필요로 한다.

Flannel 설치

CNI 중에 Flannel 을 이용하려고 한다. 다음과 같이 설치를 해준다.

설치를 하고 기다리면 다음과 같이 오류가 발생한다.

잠깐 시간을 주고 기달리면 모두 Running 상태가 된다. 만일 오랜 시간이 지나도 Running 이 아니라면 kubelet 을 재시작 해준다.

Kubelet cgroup driver 교체

혹시나 kubelet 의 cgroup driver 를 교체 해줘야 한다면 다음의 파일을 열어서 드라이버를 교체 해주면 된다.

Ubuntu 18.04, Static IP 할당하기

Ubuntu 18.04 의 경우 네트워크 인터페이스 관련 작업은 netplan 으로 바뀌었다. 만일 Static IP 를 할당하고 싶다면 netplan 의 설정 파일을 수정하고 적용하면 된다.

/etc/netplan/*.yml

여기서 파일을 수정하면 된다. 대략 다음과 같은 포맷을 갖는다.

dhcp4: yes 로 되어 있는 경우에는 DHCP 로 아이피를 받아온다. 하지만 이것을 no 바꾸면 Static IP 를 할당할 수 있다.

netplan 적용

수정을 다 했다면 다음과 같이 적용해 준다.

Ubuntu 18.04 ethernet 이름 변경하기

Ubuntu 18.04 를 설치하면 ethernet 인터페이스 이름이 과거 eth0 가 아닌 ens3 과 같이 나온다. 하지만 아직도 많은 프로그램들이 기본적으로 eth0 를 기본으로 찾기도 한다. eth0 변경하는 방법에 대해 다룬다.

GRUB 파라메터 수정

다음과 같이 Grub 에 파라메터를 추가 한다. Grub 에 파라메터는 /etc/default/grub 파일에서 다음과 같이 추가할 수 있다.

수정된 사항이 Grub 에 반영하기 위해서 업데이트를 수행한다.

여기서 중요한 것이 바로 재부팅을 하면 안된다. 특히나 DHCP 환경에서는 다음의 단계를 수행한 후에 재부팅을 해야 한다.

netplan 수정

netplan 은 Ubuntu 17.04 에서 소개된 기능으로 네트워크 인터페이스 관련 작업을 해준다. 이 프로그램은 /etc/netplan/*.yml 파일을 참조하는데, Ubuntu 18.04 의 경우에 /etc/netplan/01-netcfg.yaml 파일을 참조 한다.

eth0 부분이 수정한 것이다. 이렇게 수정을 다 했으면 다음과 같이 명령어를 수행해 준다.

이렇게 한 후에 재부팅을 하면 DHCP 환경에서 문제 없이 eth0 인터페이스 이름으로 네트워크가 정상 동작한다.

Trac 에서 Ticket 삭제하기

Trac 을 사용하다보면 Ticket 을 삭제하고 싶을때가 있다. Ticket 삭제 플러그인이 존재하지만 Ticket 이란게 자주 삭제를 하는 것이 아니여서 굳이 이것을 설치해서 사용해야할 만큼은 아닌듯 한데, 그런데도 잘못된 Ticket 을 삭제해야한다면 다음과 같이 하면 된다.

trac-admin 을 활용하면 된다.

출처: Deleting trac tickets created since a certain date until today

두번째 방법으로 ‘ticket.deleter’ 를 활성화하면 된다. 이는 Trac 에서 공식지원하는 것으로 Ticket 웹화면에서 Reply 버튼 옆에 Delete 버튼이 나타난다. 이를 위해서는 trac.ini 설정파일에 다음과 같이 설정해준다.

Ansible, ec2.py 를 이용한 Dynamic Inventory 활용

Ansible 에는 접속 정보와 관련된 정보들을 Inventory 라고 부른다. 접속 호스트, 접속 계정 정보뿐만 아니라 이들을 그룹으로 묶거나 변수 설정도 가능하다.

그런데, 클라우드 시스템과 같이 서버 관련 정보를 API 형식으로 제공할 경우에 일일이 호스트 정보를 파일로 저장할 필요가 없다. 클라우드 시스템에 서버 관련 정보를 호출하며 자동으로 Inventory 정보가 생성되는 기능을 제공하는데 이를 Dynamic Inventory 라고 한다. 이 기능은 클라우드 뿐만 아니라 LDAP 과 같은 인증 시스템에도 활용가능하다.

Ansible 세팅

AWS 클라우드의 Dynamic Inventory를 활용하기 위한 Ansible 을 세팅해 보자. 가장 중요한 ansible.cfg 는 다음과 같다.

특별히 inventory 에는 AWS 클라우드에 제공하는 Dynamic Inventory 스크립트 위치를 지정해준다. ansible 을 이용한 접속 정보, 실행할 계정에 대한 정보등을 기재한다.

디렉토리는 구조는 대략 다음과 같다.

AWS 클라우드 Dynamic Inventory 파일

AWS 클라우드의 경우에도 Ansible 의 Dinamic Inventory 기능을 제공한다. 작동원리는 AWS 자원 정보를 불러오고 이것을 Ansible 이 인식하는 Inventory 정보를 구성하는 것이다. AWS 자원 정보를 불러오기 위해서 AWS 는 다음과 같은 스크립트와 환경설정 정보를 제공한다.

ec2.py 는 AWS 클라우드 시스템에 호스트 관련 정보를 불러오도록 한다. ec2.ini 는 어디, 어떤 정보를 불러올 건지 어떤 내용을 출력할 것인지를 지정할 수가 있다. 예를들면 다음과 같다.

regions 이 기본값은 all 이다. 이러면 모든 리전에 대해서 호스트 정보를 수집할려고 하기 때문에 시간이 오래걸리는 문제가 발생한다. 특정한 리전에 대해서만 수행하도록 지정하는 것이 좋다.

IAM 설정

가장 중요한것이 IAM 설정이다. Ansible 을 실행하는 서버에는 호스트 정보를 불러올수 있는 IAM 권한이 필요하다. 보통 IAM Role 지정이라고 하는데 대략 다음과 같은 Policy 를 만들어 Role 적용을 하면 된다.

Access Key, Secret key 를 이용하는 방법도 있지만 권장하지 않는다.

ec2.py 테스트 및 특징

이제 요건이 갖춰졌으니 테스트를 해보자.

내용을 보면 위와같은 key 값들을 보게 된다. 집작했겠지만 ec2.py 는 ec2 인스턴스의 tag 를 key 로 지정해준다. tag 뿐만 아니라 ec2 인스턴스의 정보를 key 만들어준다.

이 key들은 Ansible Inventory 의 group 변수로 활용이 가능하다.

ec2 key pair 를 이용한 접속 정보 만들기

ec2.py 에서 key 들은 곧바로 Ansible 의 group 으로 활용 가능하다. 이를 위해서 inventory/production/group_vars 디렉토리에 key 이름으로 yaml 파일을 생성한다. 그리고 다음과 같이 내용을 입력한다.

Ansible이 그룹 접속을 할때에 위 변수를 활용하게 된다. AWS 클라우드 ec2 접속하기 위한 keypair 를 이용하는데 따른 설정이다.

접속 테스트

이제 다 됐다. 다음과 같이 접속 테스트를 한번 해본다.

위와같이 나오면 성공한 것이다.