Intro
이번 컨텐츠에서는 Packer를 통해 EC2 이미지를 만드는 과정을 설명합니다. 해당 과정에서 아주 기초적인 Ansible을 사용합니다.
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 |
---|