IaC(Infrastructure as Code)

Packer Part. 5 (Post Processor)

cwchoiit 2024. 3. 15. 10:37
728x90
반응형
SMALL
728x90
SMALL

 

Post Processor

Post Processor란 말 그대로 후처리기이다. 패커가 빌드를 한 후에 실행되는 작업들을 정의하는 부분이라고 보면 되겠다.

문서를 보면 여러 Post Processor가 있는것을 확인할 수 있다.

 

Post-Processors | Packer | HashiCorp Developer

Post-processors run after the image is built by the builder and provisioned by the provisioner(s).

developer.hashicorp.com

이 중에서 자주 사용되는 몇가지를 알아보자.

Checksum

Packer로 빌드를 하면 보통은 산출물이 나오게 된다. 이를 Artifact라고 하는데, 이 Artifact를 가지고 후처리기가 또 다른 산출물을 만들게 된다. 그럼 Checksum은 어떤것이냐면, 해시함수를 이용해서 파일의 무결성을 검증하는 용도라고 생각하면 된다. 그래서 데이터 파일이 주어지면 해당 파일을 가지고 md5, sha256 같은 checksum type을 통해 해시값을 구하고 이 파일이 변조된 상태인지 아닌지를 판단할 수 있게 해준다.

 

Compress

빌드 결과물을 압축해주는 후처리기이다. 

 

Manifest

Packer가 빌드를 하면 빌드 결과에 대한 메타데이터를 가지는 파일이 있는데 이 파일을 만들어주는 후처리기이다.

 

Local Shell

사용자가 원하는 후처리기가 없을 때 커스텀하여 만드는 후처리기이다. 그래서 로컬 머신에서 원하는 명령어를 수행할 수 있게 된다.

 

 

Post Processor 사용해보기

이제 직접 후처리기를 사용해서 어떤식으로 동작하는지 확인해보자.

versions.pkr.hcl

packer {
    required_version = "~> 1.7"

    required_plugins {
        amazon = {
            version = "~> 1.0"
            source = "github.com/hashicorp/amazon"
        }
    }
}

sources.pkr.hcl

data "amazon-ami" "ubuntu" {
    filters = {
        virtualization-type = "hvm"
        name = "ubuntu/images/*ubuntu-focal-20.04-amd64-server-*"
        root-device-type = "ebs"
    }

    owners = ["099720109477"]
    most_recent = true
}

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 = data.amazon-ami.ubuntu.id

    ssh_username = "ubuntu"
}

main.pkr.hcl

build {
    name = "cwchoiit-packer"

    source "amazon-ebs.ubuntu" {
        name = "nginx"
        ami_name = "cwchoiit-packer"
    }

    post-processor "manifest" {} # 첫번째 post-processor는 빌드 산출물을 다이렉트로 입력으로 받게 된다.

    post-processors {
        # post-processors의 첫번째 post-processor 역시 빌드 산출물을 다이렉트로 입력으로 받는다.
        post-processor "shell-local" {
            inline = ["echo Hello World ! > artifact.txt"]
        }
        # post-processors의 첫번째가 아닌 post-processor들은 첫번째 단계의 산출물을 입력으로 가져올 수 있게 된다.
        # 여기 같은 경우는 첫번째 post-processor가 shell-local이라 딱히 산출물이 없는데 파일(artifact.txt)을 만들어내는 스크립트가 있다.
        # 그리고 그 파일을 post-processor의 산출물로 만들고 싶으면 이 "artifice" 라는 후처리기를 사용하면 된다.
        # 그러면 이 files에 지정한 파일들을 다음 post-processor에게 전달하게 된다.
        post-processor "artifice" {
            files = ["artifact.txt"]
        }
        post-processor "compress" {}
    }

    post-processors {
        # post-processors의 첫번째 post-processor 역시 빌드 산출물을 다이렉트로 입력으로 받는다.
        post-processor "shell-local" {
            inline = ["echo Finished!"]
        }
    }
}

 

이 파일에 후처리기가 존재한다. 후처리기는 post-processor, post-processors 두 개의 블록으로 만들어 낼 수 있고 문자 그대로 복수개나 단일개냐의 차이가 있다. 그리고 후처리기를 사용하면서 알아야 할 것이 있는데 빌드가 끝난 후 최초의 post-processor와 post-processors의 첫번째 post-processor는 모두 빌드 산출물을 다이렉트로 입력으로 받게 된다. 그럼 post-processors의 두번째 세번째는 어떻게 동작하냐면 post-processors의 첫번째 post-processor의 산출물을 입력으로 가져올 수 있게 된다. 근데 저 예시에서 보면 첫번째 후처리기가 shell-local이고 이 녀석같은 경우 별다른 산출물을 만들어 내지 않는데 명령어로 artifact.txt라는 파일을 만들었다. 이 파일을 산출물로 만들고 싶으면 사용할 수 있는 다음 후처리기가 artifice라는 후처리기이다. 그 후처리기한테 files 리스트에 원하는 산출물을 넣으면 그 파일이 다음 후처리기에게 산출물로 적용된다.

 

이제, 이것을 실행해보자.

packer build .

 

아래 보면, Running post-processor 부분이 있다. 순서대로 manifest, shell-local, artifice, compress, shell-local 순으로 진행되는 모습을 볼 수 있다.

그리고 이렇게 빌드가 끝나면 실행한 경로에서 다음과 같이 새로운 파일들이 생겨났음을 볼 수 있다.

 

하나는 manifest 후처리기를 통해 만들어진 manifest 파일이고, 하나는 compress 후처리기를 통해 만들어진 압축파일이다. 압축파일을 풀어보자. 우선 어떤 형태의 파일인지 알아보기 위해 다음 명령어를 수행해보자.

보면 gzip 파일 형식으로 되어있다. 그래서 이름을 .gz 형태로 바꿔보자.

mv packer_ubuntu_amazon-ebs packer_ubuntu_amazon-ebs.gz

 

다음은, gzip형태의 파일을 압축 해제한다.

gunzip packer_ubuntu_amazon-ebs.gz

 

그 다음, 다시 파일의 형태를 살펴보면 tar 파일 형식임을 알 수 있다.

 

이제 tar 형식의 파일도 압축 해제하자.

tar xvzf packer_ubuntu_amazon-ebs

 

그럼 비로소 우리가 만든 artifact.txt 파일이 보여진다.

 

확인해보면 다음과 같은 결과를 얻는다.

 

 

결론

후처리기를 사용해서 패커 빌드 이후 작업을 수행해보았다. 

728x90
반응형
LIST

'IaC(Infrastructure as Code)' 카테고리의 다른 글

Ansible Part. 2 (Adhoc)  (3) 2024.03.17
Ansible Part. 1 (Inventory)  (3) 2024.03.17
Packer Part. 4 (Data Source)  (0) 2024.03.14
Packer Part. 3 (Provisioner)  (0) 2024.03.14
Packer Part. 2 (Builder)  (0) 2024.03.14