HCL2形式ファイルでのPacker実行


要約

PackerをHCL2で記述してみた

背景

Packer 1.5.0からHCLを対応したとのことなので、使ってみた。

ここでは、以下のようにPackerを使う

実施内容

PackerとAnsibleを使いNginxのVMイメージ(カスタムイメージ)をGCP上で作成する。

詳細条件

  • Packer version: 1.5.4
  • ansible version: 2.9.4
  • IaaS: GCP

フォルダ構成は、下記の通り

  ./
   |
   +- build.pkr.hcl
   +- locals.pkr.hcl
   +- source.pkr.hcl
   +- variables.pkr.hcl
   |
    -scripts/
         |
         - ansible-playbook.yaml

記法

  • packerビルドを実行するファイルの拡張子: .pkr.hcl
  • 処理のブロック: source, build , variables , locals

各ファイルの中身

build.pkr.hcl
build {
  sources = [
    "source.googlecompute.nginx"
  ]
  provisioner "ansible" {
    playbook_file   = "./scripts/ansible-playbook.yaml"
    user            = "packer"
    extra_arguments = ["-vvvv"]
  }
}
source.pkr.hcl
source "googlecompute" "nginx" {
  project_id          = "ca-kitano-study-sandbox"
  source_image_family = local.img_fam
  preemptible         = true
  ssh_username        = "packer"
  zone                = "asia-northeast1-b"
  image_name          = var.image-name
  tags                = ["packer"]
}
locals.pkr.hcl
locals {
  img_fam = "debian-9"
}
variables.pkr.hcl
variable "image-name" {
  type = string
  default = "nginx-demo"
}

Ansible Playbookは下記の通り。

ansible-playbook.yaml
- hosts: all
  become: true
  tasks:
    - name: package repository update
      apt:
        update_cache: yes

    - name: install nginx
      apt:
        name:
          - nginx

実行方法

$packer build ./

実行が成功すると、GCP上に image_name で指定したカスタムイメージが作成される。

まとめ

packerをhcl2形式で記載した。json形式よりも書きやすい。
TerraformでHCL形式に慣れている人は、是非使っていくとよいと思う。