Provisioner
Provisioner는 머신 이미지 내부에 필요한 설정이나 소프트웨어를 설치할 때 사용한다. 예를 들면 필요 패키지 설치, 사용자 생성 등 이런 머신 이미지 내 필요한 작업을 Provisioner를 통해서 할 수 있다. 그리고 이 Provisioner의 종류가 굉장히 많다. 문서를 참조하면 더 많은 정보를 알 수 있다.
그럼 직접 사용해보자.
versions.pkr.hcl
각 버전 정보들을 기입한 파일이다. 특이 사항은 없다.
packer {
required_version = "~> 1.7"
required_plugins {
amazon = {
version = "~> 1.0"
source = "github.com/hashicorp/amazon"
}
}
}
sources.pkr.hcl
빌드에 필요한 source 정보를 기입한 파일이다. Amazon EBS 리소스를 가진 AMI를 만들 예정이다. 지난 시간에 작성한 내용과 일치하니 특이 사항은 없다.
source "amazon-ebs" "ubuntu" {
instance_type = "t2.micro"
region = "ap-northeast-2"
subnet_id = "subnet-0b23fd05b5919269e"
associate_public_ip_address = true
ssh_interface = "public_ip"
source_ami_filter {
filters = {
name = "ubuntu/images/*ubuntu-focal-20.04-amd64-server-*"
root-device-type = "ebs"
virtualization-type = "hvm"
}
most_recent = true
owners = ["099720109477"]
}
ssh_username = "ubuntu"
}
files/index.html
<h1>Hello Packer</h1>
main.pkr.hcl
이 파일에서 실제로 어떤것을 빌드할지를, 빌드 후 어떤 처리를 할지를 정의한 파일이다.
build {
name = "cwchoiit-packer"
source "amazon-ebs.ubuntu" {
name = "nginx"
ami_name = "cwchoiit-packer-nginx"
}
# Provisioner는 정의한 순서대로 실행하기 때문에 순서가 중요하다.
provisioner "shell" {
inline = [
"sudo apt-get update",
"whoami",
]
}
provisioner "file" {
source = "${path.root}/files/index.html"
destination = "/tmp/index.html"
}
provisioner "shell" {
inline = [
"echo ${source.name} and ${source.type}",
"whoami",
"sudo apt-get install -y nginx",
"sudo cp /tmp/index.html /var/www/html/index.html"
]
}
provisioner "breakpoint" {
disable = false
note = "For debugging"
}
}
source는 위에서 작성한 amazon-ebs.ubuntu를 사용한다. 그리고 name, ami_name을 expand했다.
이제 provisioner가 4개 있다. shell provisioner는 내부에서 명령어를 통해 어떤 작업을 하기 위해서 사용한다.
첫번째 shell provisioner는 ubuntu의 패키지 매니저인 apt-get update를 하고 현재 사용자가 누구인지를 알려주는 명령어를 실행한다.
두번째 file provisioner는 로컬의 파일을 내부로 복사하는 역할을 한다. path.root는 이 build 블록이 있는 파일을 가리킨다.
세번째 shell provisioner는 source라는 녀석을 가져와 명령어에 사용할 수 있음을 보여주기 위해 작성하고, 현재 유저가 누구인지와, nginx를 설치하는 작업, 복사한 파일을 nginx가 띄우는 경로로 이동하는 작업까지 진행한다.
네번째 breakpoint provisioner는 디버깅용으로 사용된다. 작업 중에 잠시 멈춰진다. 다음과 화면을 보자.
이 상태에서 사용자가 Enter를 입력해야 다음으로 넘어간다.
이제, Enter를 입력하기 전에 Build를 한 내용대로 인스턴스가 만들어졌는지 확인해보자. (Enter를 입력하면 AMI를 만들어내기 위한 모든 작업을 끝마쳤기 때문에 인스턴스를 중지하고 종료해서 인스턴스에서 작업된 내용을 확인할 수 없다.)
Build 과정은 머신위에 Nginx를 설치하고 파일 하나를 옮겼고 그 파일을 Nginx가 웹 상에 호스팅하게 했다. 한번 확인해보자. 우선 생성된 인스턴스의 보안 그룹에 80 포트를 허용해주자.
그래야 80 포트로 밖에서 접속할 수 있다. 그 다음, 해당 인스턴스의 Public IP로 들어가보면 위 index.html 파일이 보여진다.
이렇게 우리가 설정한 대로 Provisioner가 작동한 것이다. 이런 설정 및 패키지 설치와 같은 작업을 Provisioner가 한다고 보면 된다.
그리고 반드시 명심할 것: Provisioner는 작성한 순서대로 동작한다. 이제 엔터를 입력해서 끝마치자.
'IaC(Infrastructure as Code)' 카테고리의 다른 글
Packer Part. 5 (Post Processor) (2) | 2024.03.15 |
---|---|
Packer Part. 4 (Data Source) (0) | 2024.03.14 |
Packer Part. 2 (Builder) (0) | 2024.03.14 |
Packer Part. 1 (0) | 2024.03.14 |
Terraform Provisioner/EC2 Userdata (2) | 2024.03.11 |