Packerを一度も触ったことがなかったので触ってみたメモ。
シェルスクリプトのプロビジョニングでnginxがインストールされたAMIを作成。
参考
環境
- MacOSX 10.10.5(Yosemite)
- Packer 0.8.6
インストール
# バイナリをダウンロード
$wget https://dl.bintray.com/mitchellh/packer/packer_0.8.6_darwin_amd64.zip
# ~/packerに配置
$mkdir ~/packer
$mv packer_0.8.6_darwin_amd64.zip ~/packer
$cd ~/packer
$unzip packer_0.8.6_darwin_amd64.zip
$rm packer_0.8.6_darwin_amd64.zip
# PATHを通す.bashの場合、~/.bashrcに追記
$vi ~/.zshrc
# packer
export PATH=$PATH:$HOME/packer
# 確認
$source ~/.zshrc
$packer --version
0.8.6
AWSアクセスキーの設定
AWSのアクセスキーを設定します。
以下のいずれかの設定をしておけば大丈夫のようです。
- 環境変数に設定。アクセスキーは「AWS_ACCESS_KEY_ID」か「AWS_ACCESS_KEY」。シークレットキーは「 AWS_SECRET_ACCESS_KEY」か「AWS_SECRET_KEY」
- ~/.aws/credentials
- EC2上で実行している場合、IamInstanceProfile(IAMロール)による設定
templateの作成
nginxがプリインストールされたAMIを作成するためのテンプレートファイルを作成します。
sample.json
{
"builders": [
{
"type": "amazon-ebs",
"region": "ap-northeast-1",
"source_ami": "ami-9a2fb89a",
"instance_type": "t2.micro",
"ssh_username": "ec2-user",
"ssh_timeout": "5m",
"ami_name": "packer_example {{timestamp}}"
}
],
"provisioners": [
{
"type": "shell",
"inline": [
"sudo yum -y update",
"sudo yum -y install nginx"
]
}
]
}
実行してみる
# ファイルの確認
$packer validate sample.json
Template validated successfully.
# ビルド
$packer build sample.json
・・・
amazon-ebs: sudo: sorry, you must have a tty to run sudo
失敗しました。。。これはよく見るやつです。PackerでUserDataの設定ができるようなのでこれでsudoの設定を変えましょう。
UserDataファイルを作成します。
user_data
#!/bin/bash
sed -i 's/^Defaults.*requiretty$/#Defaults requiretty/' /etc/sudoers
service sshd reload
templateでuser_data_fileを追加し、上記ファイルを呼び出すようにします。
sample.json
"builders": [{
"type": "amazon-ebs",
"region": "ap-northeast-1",
"source_ami": "ami-9a2fb89a",
"instance_type": "t2.micro",
"ssh_username": "ec2-user",
"ssh_timeout": "5m",
"user_data_file": "user_data",
"ami_name": "packer_example {{timestamp}}"
}],
"provisioners": [{
"type": "shell",
"inline": [
"sudo yum -y update",
"sudo yum -y install nginx"
]
}]
}
実行してみると成功し、AMIが作成されていました。