본문 바로가기

오픈소스

Packer란? (2) Packer EC2 이미지(AMI) 생성 with Ansible

반응형

Intro

이번 컨텐츠에서는 Packer를 통해 EC2 이미지를 만드는 과정을 설명합니다. 해당 과정에서 아주 기초적인 Ansible을 사용합니다.
packer 자체에 대한 개념은 이전 포스팅 에서 확인할 수 있으며, 해당 컨텐츠만으로 테스트를 원한다면 아래 동작 방식 참고하시면 좋을 것 같습니다.

packer 동작 방식

 
 

0. Pre-requisites

1) packer에 대한 기본 개념 (https://h-susu.tistory.com/6)
 
2) ansible에 대한 기본 개념
 
3) packer 명령어를 수행할 local PC 혹은 EC2
 
4) packer가 AWS 계정을 통해 AMI를 만들기 위한 권한 (iam user credential / iam role with EC2)
 
 

1.  Packer 설치

윈도우와 리눅스 모두 제공하나, 해당 포스팅에서는 로컬용인 MacOS와 Packer 서버용 Linux 를 기준으로 가이드합니다.
단순히 테스트가 목적인 분들은 MacOS에서 진행해도 상관 없으나, 사내 시스템에 도입이 목적이라면 리눅스 기반으로 테스트해볼 것을 권고합니다.

1) MacOS

$ brew tap hashicorp/tap

 

$ brew install hashicorp/tap/packer


2) CentOS

$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
$ sudo yum -y install packer

 
3) Amzn Linux

$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
$ sudo yum -y install packer

 
저는 최근에 release된 amazon linux 2023을 사용해 봤습니다.

 

2.  Packer / Ansible 디렉터리 구조 

packer를 사용하며 ansible을 사용할 경우의 디렉토리 구성입니다. 정해져 있는 것은 아니지만, 일련의 작업을 운영 상에 적용하게 된다면, 하나의 git repository에 관리하는 것이 용이할 수 있습니다. 따라서 packer template 과 ansible code는 상위 디렉토리 하위에 분리하여 아래와 같은 구조를 사용하겠습니다.
 

packer
  ㄴ packer_template
  ㄴ ansible

 

 
 
 

3. Packer template 작성

* packer template은 json 과 HCL2의 포맷으로 사용되고 있습니다. 하지만 json이 legacy version 이기 때문에, 해당 컨텐츠에서는 HCL2 문법(.pkr.hcl) 을 기준으로 설명합니다.
 

source "amazon-ebs" "susu-test" {

## AMI Configuration
  ami_name             = "packer_AWS {{timestamp}}"   ## 생성될 ami 이미지의 name을 결정


## Access Configuration - ami 생성을 위해 생성되는 임시 VM 접근 관련 구성

  region               = "ap-northeast-2"

## Run configuration - 임시 VM 생성을 위한 구성

  instance_type        = "t2.micro"
  source_ami           = "ami-03f54df9441e9b380"
  ssh_username         = "ec2-user"
  ssh_interface        = "private_ip"
  security_group_id    = "sg-04ecfc52aff4553df"
  subnet_id            = "subnet-09ed3fac7457996dd"
}

build {
  sources = ["source.amazon-ebs.susu-test"]

  provisioner "ansible" {
      playbook_file = "/home/ec2-user/packer/ansible/susu.yml"
  }
}


 
크게 source block(builder)과 build block(provisioner)을 구성하여 packer template를 완성합니다.
 
---------

source block - 이미지를 생성(빌드) 하기 위한 사전 작업이 필요한 부분입니다.

 
ami_name: 생성될 ami(이미지)의 이름입니다.
 
instance_type : ami를 만들기 위해 생성되는 임시 EC2의 스펙입니다. 
 
source_ami : ami를 만들기 위해 생성되는 임시 EC2의 base 이미지입니다. 임시 EC2를 통해 ami를 생성하기 때문에, ami를 만들기 위한 base ami로 이해해도 무방합니다.
 
Security group / Subnet : 이 두 값이 없으면, packer는 이미지 작업을 진행할 때 새로운 VPC를 만들고 거기에 임시 EC2를 띄워버리는데요. 이 두가지 옵션을 통해, 기존 subnet, 기존 sg를 사용해 빌드를 위한 임시 packer 서버를 생성할 수 있습니다.
(*subnet을 지정할 경우 vpc id는 subnet을 통해 참고한다고 하니, vpc 값은 필수는 아닙니다)
 
AWS 인증 :  로컬에서 작업할 경우, aws credential key를 packer template 안에 변수로 넣어주어야 합니다. 해당 포스트에서는 EC2에서 Packer를 실행했고, EC2에 Role이 attach되어 있기 때문에 별다른 작업은 하지 않습니다.
 
SSH 인증 : 별도 설정하지 않을 경우 packer에서 임시 key를 만들어서 사용하고 작업이 끝날 시 폐기합니다. 이외에 일부 필요한 파라미터를 넣었습니다.
 
---------

build block - 만들어진 임시 EC2에서, 정의된 빌드 작업을 수행하는 부분입니다.

sources: 사용할 source를 선언합니다. 
 
provisioner: 빌드를 수행할 방식에 대해 정의하고, 관련 빌드 명령어를 넣습니다. 해당 컨텐츠에서는 provisioner로 ansible을 사용합니다.
 
---------
 
템플릿 내용을 .pkr.hcl 확장자의 파일로 생성한 후, packer_template 디렉토리에 위치합니다.

 
 
reference:
source - ebs 기반 ami 생성
build - ansible provisioner 사용
 
 

ansible-playbook 파일

실습을 위해 간단한 playbook 파일을 생성해봅시다. 해당 컨텐츠에서는 ansible에 대해서는 설명하지 않습니다. (추후에 작성해볼게요)
pip와 ansible을 설치하는 ansible 코드를 작성했습니다.
 

- name: 'Provision Image'
  hosts: default
  become: true

  tasks:
    - name: install pip
      shell: sudo yum -y install pip
    - name: install ansible
      shell: sudo pip install ansible

 
해당 파일은 .yml 확장자로 ansible 디렉토리 하위에 위치시킵니다.

 

4.  Amzn Linux 2023 Ansible 설치

Amzn Linux 2023 의 경우 기존 Amzn linux2 방식의 Ansible 설치방법이 잘 되지 않더라구요 (혹시 찾으신 분은 공유좀..)
따라서 일단은 yum을 통해 pip를 설치하고, pip를 통해 Ansible을 설치합니다.
 

$ sudo yum install -y pip
$ sudo pip install ansible

 

5.  Packer 명령어를 통해 빌드 실행

이제 packer와 ansible을 통해 이미지를 만들기 위한 준비가 다 되었습니다. (packer / ansible / packer template / ansible code)
packer build {packer template 파일} 을 통해 이미지를 빌드해 봅니다.

정상적으로 빌드가 완료되었네요!🚀
 

6. 생성된 ami 확인  / ansible 적용 여부 확인

이제 콘솔에서 AMI를 확인해 보고, 해당 이미지를 사용해 EC2를 만들어 보겠습니다. 이후에 pip과 ansible 설치여부를 확인하여 ansible 정상 동작 유무를 확인합니다.
 
 
AMI는 정상적으로 생성되었네요. 

 
이제 이 이미지로 EC2를 만들어 보겠습니다.

 
 
서버가 생성되었다면 마지막으로 pip / ansible 설치여부를 확인합니다.

정상적으로 설치가 되었네요.

 
 packer template은 공식 문서를 참고해, 해당 예제보다 훨씬 디테일한 설정이 가능합니다. 또한 여러 파라미터에 대해 변수처리가 가능한데요. 따라서 Production level 의 packer code는 깊은 고민과 설계가 필요합니다 👀
 
해당 포스팅에서 Packer 설치 / Packer 템플릿 작성 / ansible을 사용한 packer 빌드에 대해 알아보았습니다.

배워가며 작성하는 블로그입니다.
피드백 및 의견 환영입니다 🙂

반응형

'오픈소스' 카테고리의 다른 글

Packer란? (1) 개념 소개, 설치 방법  (1) 2023.02.14