IaC(Infrastructure as Code)

Packer Part. 3 (Provisioner)

cwchoiit 2024. 3. 14. 11:51
728x90
반응형
SMALL
728x90
SMALL

 

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는 작성한 순서대로 동작한다. 이제 엔터를 입력해서 끝마치자.

 

728x90
반응형
LIST

'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