Packer + Jenkins(on EC2)で自動AMI作成

Packerを使用してAMIの作成を自動化が出来たのでJenkinsでCIしてみようと思います。
Packerの使い方やJenkinsの使い方は割愛して簡単にポイントのみまとめます。

Jenkinsの設定

Gitリポジトリを指定

こちらのようなリポジトリを作成します。 template.jsonがPackerのテンプレートファイルです。

ジョブの設定

シェルの実行で以下のようにシェルを設定します。
packerをインストールしてしまえば毎回ダウンロードする必要はありません。

mkdir packer
cd packer
wget -o - https://dl.bintray.com/mitchellh/packer/packer_0.8.0_linux_amd64.zip
unzip packer_0.8.0_linux_amd64.zip
cd ../

./packer/packer build template.json

rm -rf ./packer
exit 0;

設定は以上です。あとは好きなタイミングでジョブが動くように設定します。

注意する点

Jenkinsからpackerを使用してsshするとsudoが使用できない

packerを使用するとEC2にsshで接続してコマンドを実行しようとしますが、
スクリプト内でsudoを使用するとエラーが出て失敗してしまいます。

sudo: sorry, you must have a tty to run sudo

解決法

そのため、ここではEC2のUserDataにて/etc/sudoersを編集するようにしました。
packerではAMI作成用のEC2にUserDataを指定できるため、そこでsudoの設定を変更します。

#!/bin/bash -ex
sed -i 's/Defaults    requiretty/Defaults    !requiretty/g' /etc/sudoers

その他、sudoで実行したいコマンドがあればここで実行しておくと良いです。
ビルダーのuser_data_fileにファイル名を指定すると起動時にUserDataへ設定されます。

{
  "builders": [{
    "type": "amazon-ebs",
    "region": "ap-northeast-1",
    "source_ami": "ami-cbf90ecb",
    "instance_type": "t2.micro",
    "ssh_username": "ec2-user",
    "ami_name": "packer-ami-{{timestamp}}",
    "user_data_file": "files/user-data.txt"
  }],
  "provisioners": [{
    "type": "shell",
    "scripts": [
      "scripts/create-user-dirs.sh",
      "scripts/install-packages.sh"
    ]
  }]
}