GiitHubAction에서 Packer+Ansible를 사용하여 자동으로 이미지를 구성하는 동작

개시하다


기계 이미지를 자동으로 생성하는 Packer편리한 도구죠.Packer를 사용하면 하나의 지령으로 이미지를 구축할 수 있지만 하나의 지령도 자동화되면 쉬울 것 같아서 GiitHub Actions에서 Ansible의 provisioner에서 사용하는 Packer 빌딩을 만드는 방법을 쓰고 싶습니다.

메서드


GiitHub Actions에서 하려면 먼저 공식적으로 준비한 작업 절차를 사용합니다.
물론 Packer에도 공식적인 업무 절차가 있다.
https://github.com/marketplace/actions/packer-github-actions
하지만 공식적인 작업 절차라면 Provisionar는 Ansible를 사용할 수 없을 것 같습니다
이 issue에 적힌 것처럼 ansible-playbook 실행할 수 없는 느낌이다.
https://github.com/hashicorp/packer-github-actions/issues/20
페이커의 작업 흐름은 주자의 Docker 컨테이너에서 수행되기 때문에 안에 Ansible가 설치되어 있지 않은 것 같다.
따라서 공식적인 작업 절차에서 Ansible을 사용할 수 없기 때문에 도커의 이미지와 동작을 스스로 준비할 필요가 있으니 제작하세요!
참고로 자신의 작품의 동작을 자세히 알고 싶으면 아래 공식 문서를 참고하세요.
https://docs.github.com/ja/actions/creating-actions
이번에 Docker가 컨테이너 동작으로 Packer+Ansible을 만들 거예요.
https://docs.github.com/ja/actions/creating-actions/creating-a-docker-container-action

방법


일단 목록 구성은 다음과 같은 느낌.
├── .github
│   └── workflows
│       └── packer.yml
├── Dockerfile
├── action.yml
├── entrypoint.sh
└── packer
    ├── packer.json
    └── roles

Docker 이미지 준비


먼저 Docker file을 작성합니다.
하는 일은 debian의 기본 인상을 사용하고 Packer와 Ansiblen이 설치되어 있습니다.
설치에 관해서는 이쪽의 공식 문서를 참고하였다.
https://learn.hashicorp.com/tutorials/packer/get-started-install-cli
https://docs.ansible.com/ansible/2.9_ja/installation_guide/intro_installation.html#debian-ansible
FROM debian:buster-slim
RUN apt update
RUN apt -y upgrade
RUN apt -y install gnupg
RUN apt -y install curl
RUN apt -y install software-properties-common

# Install Packer
RUN curl -fsSL https://apt.releases.hashicorp.com/gpg | apt-key add -
RUN apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
RUN apt update && apt -y install packer

# Install Ansible
RUN echo "deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main" >> /etc/apt/sources.list
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367
RUN apt update && apt -y install ansible

COPY "entrypoint.sh" "/entrypoint.sh"

ENTRYPOINT ["/entrypoint.sh"]

action.준비


GiitHub Actions에서 사용자가 정의한 작업을 수행하려면 작업을 수행합니다.yml 제작이 필요합니다.
하고 있는 일로 input과command에서 일합니다.directory의 두 개의 입력을 받아 방금 준비한 Docker 동작을 실행하기 위해runs에 Docker file을 설정합니다.
action.공식 문서에는yml에 대한 상세한 내용이 상세하게 기재되어 있다.
https://docs.github.com/ja/actions/creating-actions/metadata-syntax-for-github-actions
# action.yml
name: 'Packer Build'
description: 'Automatic build with Packer'
inputs:
  command:
    description: 'input command'
    required: true
  
  working_directory:
    description: working directory for command (defaults to root)
    required: false

runs:
  using: 'docker'
  image: 'Dockerfile'

entrypoint.sh의 준비


entrypoint.sh는 다음과 같다.
하고 있는 일로 아까 액션.yml의 input에 정의된command와workingdirectory에서 얻은 입력으로 환경 변수INPUT_COMMANDINPUT_WORKING_DIRECTORY필요한 입력 항목command가 없으면 오류를 토로하고 끝냅니다.어떤 경우에는 일을 한다directory에서 지정한 디렉토리의 CD에서 명령을 실행합니다.
#!/usr/bin/env bash

set -e

# fail if INPUT_COMMAND is not set
if [ -z "${INPUT_COMMAND}" ]; then
  echo "Required variable \`command\` is missing"
  exit 1
fi

if [ -n "${INPUT_WORKING_DIRECTORY}" ]; then
  cd "${INPUT_WORKING_DIRECTORY}"
fi

${INPUT_COMMAND}

workflows/packer.yml


드디어 작업흐름에 관한 서류가 도착했습니다.
다음과 같은 느낌이 듭니다.
설정 uses:./ 을 통해 방금 만든 동작입니다.실행하다
그리고 커맨드랑 워크맨.directory에서 실행할 명령과 디렉터리를 지정합니다.
명령을 직접 전달하는 형식이기 때문에validate 명령 등을 통해 문법 검사를 할 수도 있다.
with:
  command: packer build packer.json
  working_directory: ./packer
이 작업 절차라면onworkflow_dispatch이기 때문에 수동으로 실행할 수 있습니다.
이 부분은 PR 합병 시 다양한 설정이 가능하며 취향에 맞게 변경할 수 있다.
name: Packer Build

on:
  workflow_dispatch:

jobs:
  packer:
    runs-on: ubuntu-latest
    name: packer
    
    steps:
      - uses: actions/checkout@v2

      - name: Packer Validate
        uses: ./
        with:
          command: packer validate -syntax-only packer.json
          working_directory: ./packer
      
      - name: Packer Build
        uses: ./
        with:
          command: packer build packer.json
          working_directory: ./packer

실행하다

workflow_dispatchGiitHub의 창고 라벨에서 Actions 선택

방금 Select Workflow에서 만든 Packer Build 선택
Run workflow에서 수행할 수 있습니다.

실행 후 이런 느낌으로 step 옆에 체크 표시를 하면 성공합니다.

총결산


나는 이렇게 하면 GiitHub Actions에서Ansible를 사용하여 Packer 빌딩을 지을 수 있을 것이라고 생각한다.
앞으로도 본격적인 업무 절차에서도 할 수 있었으면 좋겠어요!
그리고 이번에 제작된 용기에서 지령을 수행하는 동작은 통용성이 높아 기릿허브 액션스에서 이 지령을 사용하려 했지만, 제대로 된 동작을 만들지 않을 때는 제 작품도 간단해질 것 같았어요.

좋은 웹페이지 즐겨찾기