no image
[기사 번역]Terraform vs Ansible?? 어떤 것을 써야할까?
Terraform vs Ansible, Ansible vs Terrafom- 구글에서 자주 검색되는 질문들입니다. 그러나 이게 맞는 말일까요? Terraform과 ansible이 경쟁 관계에 있고 우리는 둘 중 하나만 사용할 수 있을까요? 아니면 사실 둘은 훌륭한 조합이고 함께 사용하거나 함께 사용해야 합니까? 이 기사는 Terraform vs Ansible에 대한 해답을 얻는 것을 목표로 합니다. 이 기사는 개발자의 주관적인 의견을 기반으로 합니다. Terraform Terraform 웹사이트에 따르면 Terraform은 infrastructure의 building, changing, and versioning을 안전하고 효과적으로 할 수 있는 툴입니다. Terraform은 기존의 인기있는 서비스 제공..
2020.02.12
no image
AWS에서 ansible을 사용하여 ec2 추가하기
앤서블을 공부하기 위해 주문한 '우아하게 앤서블' 책이 배송오기를 기다리며 컴퓨터에 환경 셋팅도 할겸 인터넷에 있는 간단한 앤서블 실습을 해보았습니다. 유투브에 있는 RedGeek채널의 'Create EC2 instance using Ansible'영상을 참고하여 앤서블로 AWS의 EC2를 만들어 보았습니다. (https://www.youtube.com/watch?v=gEX1HbM4KSM) 목표는 맥북 컨테이너(CentOS7.7)에서 앤서블로 AWS에 EC2를 추가하는 것으로 정했습니다. 아래 과정을 진행하기 전에 AWS에서 IAM계정 생성과 EC2를 한대 먼저 추가해놓았습니다. 1. 맥북에 도커(docker) 설치 먼저 brew install docker와 brew-casks install docker..
2020.01.11

Terraform vs Ansible, Ansible vs Terrafom- 구글에서 자주 검색되는 질문들입니다. 그러나 이게 맞는 말일까요? Terraform과 ansible이 경쟁 관계에 있고 우리는 둘 중 하나만 사용할 수 있을까요? 아니면 사실 둘은 훌륭한 조합이고 함께 사용하거나 함께 사용해야 합니까? 이 기사는 Terraform vs Ansible에 대한 해답을 얻는 것을 목표로 합니다.

 

이 기사는 개발자의 주관적인 의견을 기반으로 합니다.

 

Terraform

Terraform 웹사이트에 따르면

 

Terraform은 infrastructure의 building, changing, and versioning을 안전하고 효과적으로 할 수 있는 툴입니다. Terraform은 기존의 인기있는 서비스 제공 업체와 맞춤형 사내 솔루션을 관리 할 수 있습니다.

 

Terraform은 Slack, Twitch(독자적인 인프라 관리 툴 Cloud Formation을 가진 아마존의 소유), Uber, Startbucks같은 회사에서 사용중 입니다. Terraform은 CloudFare, Heroku, Microsoft Azure 이나 Google Compute 엔진과 통합될 수 있습니다.

 

Ansible

Ansible은 IT infrastructure와 app을 자동화하고 구성하는 가장 간단한 방법입니다. Ansible은 당신이 기업에서 어떤 자동화 플랫폼을 사용하든 상관이 없습니다.(원문 : An enterprise automation platform for the entire IT organization, no matter where you are in your automation journey.)

 

Ansible은 9gag, Zalando 그리고 Revolut같은 회사에서 사용되고 있습니다. Ansible은 Docker, Amazon Ec2 나 쿠버네티스와 같이 사용될 수 있습니다.

 

Who's the best?

우선, 어느 것이 더 좋은지 명확히 결정하기는 어렵습니다. 왜냐하면 둘은 비슷하지만 다른 목적으로 만들어 졌기 때문입니다.

 

Terrform은 orchestration tool이고 Ansible은 configuration management tool이지만 중복되는 몇몇 기능들이 있습니다. 하지만 그런 기능들은 제외되지않고 같이 사용할 수 있습니다.

저는 이 부분을  '음악가들의 오케스트레이션'에 비유해 설명 해보겠습니다. 여기서 terraform은 올바른 수의 악기들이 연주되고 소리가 올바르게 나는지 보장하는 지휘자입니다.

문제가 있을 경우 지휘자는 문제가 있는 악기를 교체합니다. 오케스트레이션 도구는 최종 결과에 중점을 두고 환경이 특정 상태로 유지되도록 할 수 있습니다. 따라서 Terraform은 환경을 정상인 상태로 유지시켜주는데 탁월한 기능을 제공합니다.

 

Ansible은 상황에 따라 다르게 동작하는 configuration management tool입니다. Ansible은 아까와 같은 상황(악기가 고장난)에서 악기를 교체하는 작업 대신 악기를 수리하기 위해 동작합니다. 물론 Ansible이 orchestration 작업을 수행할 수는 있지만 Terraform이 orchestration을 위해 더 advanced 하고 더 나은 옵션을 제공합니다.

 

Terraform에는 스레드에서 리소스 세트(종속 트리 내부)를 만들 수 있는 parallel mechanisms이 있습니다. Ansible에서 동일한 결과를 얻으려면 async와 poll을 창의적으로 사용해야 하므로 대기 시간이 있는 async blocks를 사용해야 할 것입니다.

(원문 : Terraform has built-in parallel mechanisms which allow creating a set of resources (within dependency tree) in threads. To achieve the same, Ansible would require to creatively use async and poll, which would probably make you do async blocks with a wait period between them.)

 

----Asynchronous(비동기식) : system call이 완료되지 않아도 나중에 완료가 되면 그때 결과물을 가져온다.(주로 callback 함수를 통해 결과물을 가져온다)

 

절차적(Procedural) 아니면 선언적(Declarative)?

DevOps 도구로의 또 다른 관점의 분류로는 절차적(procedural)과 선언적(Declarative)로 볼 수 있습니다. 이러한 분류는 tool이 어떻게 동작하는지 설명합니다. 여기서 Terraform은 선언적 그룹에 속합니다. 이 부분이 의미하는 것은 만약 현재 정의된 환경이 변경되었다면 그것은 Terraform에 의해서 수정된 것입니다.

 

오케스트라의 비유로 돌아가서 설명하자면 Terraform은 더 많거나 적은 악기를 선언해야합니다. 따라서 만약 당신에게 5개의 악기가 있고 5개의 악기가 더 필요하다면 코드에 그것을 배치하면 됩니다. 더 적게 필요한 경우 코드에서 당신이 원하는 만큼 삭제하면 됩니다.

 

반면 Ansible은 하이브리드로 인식됩니다. Ansible은 절차적 스타일 구성이나 선언적으로 수행하는 모듈을 사용하여 두가지 스타일 모두 수행할 수 있습니다. 그래서 문서를 읽고 예상되는 동작을 이해하는 것이 매우 중요합니다.

 

즉, Terraform은 클라우드 인프라 구성에 적합하고 Ansible은 인프라 내의 서버 구성에 사용됩니다. Terraform에는 Ansible용 provisioning plugin이 없지만 많은 사람들이 Terraform으로 서버를 만들고 Ansible로 서버를 구성합니다. Terraform내에서 필요한 Ansible role들을 호출할 수도 있습니다.

 

그러나 stackshare.io의 통계를 살펴보면 Ansible은 stackoverflow의 12k이상의 점수를 기록하고 github의 41k의 star를 가진 Terraform보다 훨씬 인기가 많습니다.

 

결론

Terraform은 불변성(immutability)를 염두에 두고 설계 되었습니다. 변하지 않는 infrastructure를 기본적인 방식으로 처리하는 provisioning tool입니다. 따라서 configuration management tool들을 거부할 때 가장 좋은 선택으로 볼 수 있습니다. Terraform은 더 직관적인 infrastructure orchestration을 위해 만들어 졌으며 Terraform의 모든 업데이트는 이 직관적인 infra를 위해 전념중이기 때문입니다.

Ansible은 configuration management에 최적화 되어 있습니다. Ansible이 orchestration을 수행할 수는 있지만 주어진 환경에 가장 적합한(가장 빠른) tool을 사용하는 것이 좋습니다.

 

Terraform과 Ansible은 모두 독립적인 도구로 작용하거나 함께 작동 될수 있지만 주어진 작업에 항상 올바른 도구를 사용해야 하는 것을 기억해야합니다.

 

기사 원문:

https://selleo.com/blog/terraform-vs-ansible?fbclid=IwAR0Ip2mrSo4NUME1c2004mpPqvxvHwRS5749FYVmbY4sLZ_760MahQQ7038

'Ansible' 카테고리의 다른 글

AWS에서 ansible을 사용하여 ec2 추가하기  (0) 2020.01.11

앤서블을 공부하기 위해 주문한 '우아하게 앤서블' 책이 배송오기를 기다리며 컴퓨터에 환경 셋팅도 할겸 인터넷에 있는 간단한 앤서블 실습을 해보았습니다.

 

유투브에 있는 RedGeek채널의 'Create EC2 instance using Ansible'영상을 참고하여 앤서블로 AWS의 EC2를 만들어 보았습니다.  (https://www.youtube.com/watch?v=gEX1HbM4KSM)

목표는 맥북 컨테이너(CentOS7.7)에서 앤서블로 AWS에 EC2를 추가하는 것으로 정했습니다.

아래 과정을 진행하기 전에 AWS에서 IAM계정 생성과 EC2를 한대 먼저 추가해놓았습니다.

 

1. 맥북에 도커(docker) 설치

먼저 brew install dockerbrew-casks install docker로 도커를 설치한다.

 

이제 컨테이너에 올릴 OS이미지를 받아야 하는데 sudo docker pull centos:7 로 centos7의 최신버전을 받을수 있다.

 

 

2. 받은 이미지로 컨테이너 생성 후 앤서블과 각종 툴 설치

docker run -i --name <name> -v <host의경로>:<컨테이너의경로> --net host -t <image>:<tag> /bin/bash

--net host 옵션을 사용하면 docker0 브릿지에 바인딩 되지않고 host와 네트워크 환경을 같이 사용하게 된다.

-v 옵션을 사용하면 host와 공유폴더를 가지게 된다. (ex. -v /Users/sm/docker:/shared_dir)

(공유 폴더를 통해서 EC2의 키페어를 컨테이너의 ~/.ssh 폴더에 이동)

 

이미지에 아무런 툴도 설치되어 있지 않은 상태라 컨테이너에 앤서블과 각종툴을 설치해준다.

일단 yum으로 컨테이너에 설치한 목록은 다음과 같다.

 

net-tools (ifconfig)

iproute(ip addr)

tcpdump

ansible

bind-utils(nslookup)

vim

wget

openssh-server

openssh-clients

openssh-askpass



ssh를 위한 포트 22를 열어주기 위해 vi /etc/ssh/sshd_config에 Port 22 부분 주석 해제해준다.

 

다음 부터는 앤서블 설치를 위한 목록이다.

yum install epel-release(앤서블 최신버전을 설치하기 위한 패키지)

yum --enablerepo=epel install ansible(앤서블 최신버전 설치)

yum install python-pip(파이썬 패키지 설치 도구)

pip install boto(AWS 파이썬 인터페이스)

 

 

3. boto에 접속할 EC2의 계정 정보를 입력하고 앤서블을 설정

컨테이너의 root 디렉토리에 .bato파일을 생성하고 AWS에서 IAM계정 생성후 받은 access key정보들을 입력한다.

vi ~/.bato

[Credentials]

aws_access_key_id = <access key id>

aws_secret_access_key = <secret access key>

 

다음은 앤서블에서 접속할 EC2의 정보를 /etc/ansible/hosts파일에 []안에는 원하는 그룹의 이름을 적고 xxx.xxx.xxx.xxx는 접속할 EC2의 public IP를 입력한다.

vi /etc/ansible/hosts


[aws]

xxx.xxx.xxx.xxx

 

 

앤서블에서 AWS의 EC2로 EC2를 추가하라는 명령을 보낼 yml파일을 생성한다.

vi add_ec2_aws.yml



- name: ec2 launcher

  hosts: aws

  connection: local

  tasks:

  - name: launching ec2

    ec2:

      instance_type: t2.micro

      key_name: keypair

      image: ami-0bea7fd38fabe821a

      region: ap-northeast-2

      group: default

      count: 1

      vpc_subnet_id: subnet-873c09cb

      wait: yes

      assign_public_ip: yes

 

 

이제 ansible-playbook add_ec2_aws.yml 명령어를 실행시키면 AWS에서 EC2가 추가된다.

-----------------------------

컨테이너에서 add_ec2_aws.yml을 실행 시킬 때 계속 EC2에서 응답이 없어서 왜 그런가 했었는데 EC2의 방화벽 인바운드에 기본적으로 ssh연결만 허용되게 되어 있어서 모두허용으로 바꾸고 진행을 했다.

 

위와 같은 에러메시지는 VPC대역(add_ec2_aws.yml의 vpc_subnet_id)값을 수정해서 해결했다.

 

 

'Ansible' 카테고리의 다른 글

[기사 번역]Terraform vs Ansible?? 어떤 것을 써야할까?  (3) 2020.02.12