📷

HCLを使ったPackerとAnsibleでAMIを作成

2023/08/30に公開

事前準備

  • Packerのインストールはこちら
  • Ansibleのインストールはこちら
  • こちらを参照してAWS CLIのCredentialsの設定もしておいてください。
    ※AWS CLIを使用したことがある方は既に設定済みだと思います。

Packer実行用のファイルを作成

まずは sources.pkr.hcl を作成してAMIを作成する際に利用するsourceを定義します。

sources.pkr.hcl
source "amazon-ebs" "test" {
  source_ami_filter {
    filters = {
      name = "amzn2-ami-hvm-*-x86_64-gp2"
    }
    owners      = ["137112412989"]
    most_recent = true
  } //公式が用意しているAmazon Linux2の最新AMIをベースにします。
  region        = var.region        // 変数
  instance_type = var.instance_type // 変数
  ssh_username  = "ec2-user"
  ssh_timeout   = "5m"
  ami_name      = "test-ami-{{timestamp}}" // 末尾にtimestampが付与されます。
}

次に build.pkr.hcl を作成してビルドの設定をします。
sourceに上記 sources.pkr.hcl で定義した amazon-ebs とスクリプトにAnsibleを使用するように設定しています。
後ほど「/scripts/main.yaml」を用意します。

build.pkr.hcl
build {
  sources = [
    "source.amazon-ebs.test"
  ]
  provisioner "ansible" {
    playbook_file   = "./scripts/main.yaml"
    user            = "ec2-user"
    extra_arguments = ["-vvvv"]
  }
}

variables.pkr.hcl を作成して先ほど使用していた変数の定義をします。

variables.pkr.hcl
variable "region" {
    default = "ap-northeast-1"
}
variable "instance_type" {
    default = "t2.micro"
}

AnsibleのPlaybookを作成

/scriptsディレクトリを用意して、その中にAnsibleのPlaybookを用意します。
「hosts」は下記のようにdefaultと設定してください。
今回はcreate-fileというロールを作成します。

/scripts/main.yaml
- hosts: default
  remote_user: ec2-user
  become: yes
  roles:
    - create-file

/scriptsに下記のようにディレクトリとファイルを用意します。

├── sources.pkr.hcl
├── build.pkr.hcl
├── variables.pkr.hcl
├── variables.json
└── scripts 
    └── roles
         └── create-file/
              ├── tasks/
              │    └── main.yaml
              └── files/
                   └── test.txt

test.txtの中身は適当に何か記載しておいてみてください。

test.txt(例)
Hello Packer and Ansible!

では/scripts/create-file/tasksディレクトリのmain.yaml/tmpディレクトリにtest.txtをコピーするような内容を記載します。

/scripts/create-file/tasks/main.yaml
---
- name: Create Textfile
  copy:
    src: test.txt
    dest: /tmp

完了したら sources.pkr.hcl等が配置されているディレクトリで、Packerのビルドを行いましょう。

$ packer build .

実行されて下記のように表示されたらPackerの実行は成功です。AMIが作成されるのを待ちましょう。

==> amazon-ebs.test: Creating AMI test-ami-****** from instance i-**********
    amazon-ebs.test: AMI: ami-**********
==> amazon-ebs.test: Waiting for AMI to become ready...

下記のように表示されたらAMIの作成は完了です。

==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs.test: AMIs were created:
ap-northeast-1: ami-**********

作成されたAMIを使用して新しくインスタンスを起動してみてください。
新しく作成されたインスタンスに/tmp/test.txtが作成されているのが確認出来たら成功です🎉

Discussion